Dart 2 中与隔离物的双向通信

Posted

技术标签:

【中文标题】Dart 2 中与隔离物的双向通信【英文标题】:Bidirectional communication with isolates in Dart 2 【发布时间】:2019-02-15 00:17:22 【问题描述】:

我正在尝试隔离,我想知道如何让其中一些进行繁重的计算,当根隔离询问他们当前的计算值时,他们会“按需”响应。

据我所知,唯一可以用作新创建的隔离消息的对象是 SendPort,这意味着只有生成的隔离可以与根隔离。我尝试发送一个 元组,但由于 ReceivePort 不是 SendPort,它被认为是非法的。

简而言之:

root good

root 隔离如何?

【问题讨论】:

***.com/questions/29247374/… 有点过时,但应该仍然有效 【参考方案1】:

从package:stream_channel看IsolateChannel。

这应该为您尝试做的事情提供很多帮助。

【讨论】:

【参考方案2】:

用Gunter 的comment 我做了这个:

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

Stopwatch stopwatch = new Stopwatch();

main(args) async 
  ReceivePort rPort = new ReceivePort();
  rPort.listen((data) 
    print("<root> $data received");
    if (data is List) 
      String action = data[0];
      if (action == "register") 
        (data[1] as SendPort).send(stopwatch.elapsedMilliseconds);
      
    
  );
  stopwatch.start();
  await Isolate.spawn(elIsolate, rPort.sendPort);
  print("isolate spawned in $stopwatch.elapsedMilliseconds msecs"); //isolate spawned in 377 msecs


void elIsolate(SendPort sPort) 
  ReceivePort rPort = new ReceivePort();
  rPort.listen((data) 
    print("<Isolate> '$data' received"); //<Isolate> '387' received
  );
  sPort.send(["register", rPort.sendPort]);

而使用Kevin 的answer 代码简化为:

import 'dart:async';
import 'dart:io';
import 'dart:isolate';
import 'package:stream_channel/stream_channel.dart';

Stopwatch stopwatch = new Stopwatch();

main(args) async 
  ReceivePort rPort = new ReceivePort();
  IsolateChannel channel = new IsolateChannel.connectReceive(rPort);
  channel.stream.listen((data) 
    print("<root> '$data' received at $stopwatch.elapsedMilliseconds msecs"); //<root> 'hello world' received at 1141 msecs
    channel.sink.add(stopwatch.elapsedMilliseconds);
  );
  stopwatch.start();
  await Isolate.spawn(elIsolate, rPort.sendPort);
  print("isolate spawned in $stopwatch.elapsedMilliseconds msecs"); //isolate spawned in 1111 msecs


void elIsolate(SendPort sPort) 
  IsolateChannel channel = new IsolateChannel.connectSend(sPort);
  channel.stream.listen((data) 
    print("<Isolate> '$data' received");
  );
  channel.sink.add("hello world");

【讨论】:

以上是关于Dart 2 中与隔离物的双向通信的主要内容,如果未能解决你的问题,请参考以下文章

Channel: flutter平台层与运行层的双向通信

autojs双向通信

RN与IOS原生双向通信以及UI绑定通信的使用方式

管道双向通信

MVC5使用SignalR进行双向通信

在 C 中使用管道在父子之间创建双向通信