写点什么

Dart Isolate 双向通讯

用户头像
Daniel
关注
发布于: 2020 年 09 月 19 日

原文:https://medium.com/@lelandzach/dart-isolate-2-way-communication-89e75d973f34



该flutter允许程序员编写异步代码。这允许Dart 2.4.0(以及Flutter)执行HTTP请求之类的事情,并耐心等待响应,然后继续执行后续代码。

Dart还允许程序员在单独的线程中异步执行代码!用Isolate类完成此操作。Dart Isolate在新产生的线程中执行特定功能。第二线程可以与主线程连续通信。

异步Dart Isolate

Isolate使用非广播ReceivePort在线程之间传递消息。这样ReceivePort只能被监听一次。

ReceivePort用于侦听消息,而SendPort用于发送消息

Dart线程代码示例

为了使Isolates异步线程,您需要导入2个Dart库。

import 'dart:async';
import 'dart:isolate';



接下来,我们将创建一个用于初始化Isolates的函数。该函数监听Isolates发送到主线程的消息。最后,该函数返回一个SendPort,因此主线程可以在需要时将数据发送到Isolates。


Future<SendPort> initIsolate() async {
Completer completer = new Completer<SendPort>();
ReceivePort isolateToMainStream = ReceivePort();

isolateToMainStream.listen((data) {
if (data is SendPort) {
SendPort mainToIsolateStream = data;
completer.complete(mainToIsolateStream);
} else {
print('[isolateToMainStream] $data');
}
});

Isolate myIsolateInstance = await Isolate.spawn(myIsolate, isolateToMainStream.sendPort);
return completer.future;
}



下面的函数将在Isolate的新线程中执行。我们将此函数的引用与SendPort一起传递给Isolate对象的spawn方法。SendPort被传递,以便新线程可以将消息发送到主线程。

void myIsolate(SendPort isolateToMainStream) {
ReceivePort mainToIsolateStream = ReceivePort();
isolateToMainStream.send(mainToIsolateStream.sendPort);

mainToIsolateStream.listen((data) {
print('[mainToIsolateStream] $data');
});

isolateToMainStream.send('This is from myIsolate()');
}



这样就可以在Dart / Flutter主线程和Isolate线程之间进行连续的双向通信

接下来,我们将创建Main。这使我们的Dart程序设置了具有双向消息传递功能的第二个线程。


void main() async {
SendPort mainToIsolateStream = await initIsolate();
mainToIsolateStream.send('This is from main()');
}



让我们将整个程序放在一起,并添加一个退出调用,这样程序就不会无限挂起。

// Example of bi-directional communication between a main thread and isolate.

import 'dart:io'; // for exit();
import 'dart:async';
import 'dart:isolate';

Future<SendPort> initIsolate() async {
Completer completer = new Completer<SendPort>();
ReceivePort isolateToMainStream = ReceivePort();

isolateToMainStream.listen((data) {
if (data is SendPort) {
SendPort mainToIsolateStream = data;
completer.complete(mainToIsolateStream);
} else {
print('[isolateToMainStream] $data');
}
});

Isolate myIsolateInstance = await Isolate.spawn(myIsolate, isolateToMainStream.sendPort);
return completer.future;
}

void myIsolate(SendPort isolateToMainStream) {
ReceivePort mainToIsolateStream = ReceivePort();
isolateToMainStream.send(mainToIsolateStream.sendPort);

mainToIsolateStream.listen((data) {
print('[mainToIsolateStream] $data');
exit(0);
});

isolateToMainStream.send('This is from myIsolate()');
}

void main() async {
SendPort mainToIsolateStream = await initIsolate();
mainToIsolateStream.send('This is from main()');
}



您将在系统输出中看到打印输出

从main传递到Isolate的消息,反之亦然。

$ dart isolate-example.dart
[isolateToMainStream] This is from myIsolate()
[mainToIsolateStream] This is from main()



现在,您可以创建多个Dart线程,并使用流在它们之间传递消息!



------------------------------------------------------------------------------

如有疑问,联系qq:120022950



发布于: 2020 年 09 月 19 日阅读数: 70
用户头像

Daniel

关注

还未添加个人签名 2019.02.27 加入

还未添加个人简介

评论

发布
暂无评论
Dart Isolate双向通讯