写点什么

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 日阅读数: 143
用户头像

Daniel

关注

还未添加个人签名 2019.02.27 加入

还未添加个人简介

评论

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