【问题标题】:Why streams in Dart isolates doesn't work without receive port为什么 Dart 隔离中的流在没有接收端口的情况下不起作用
【发布时间】:2019-10-08 07:26:20
【问题描述】:

当我尝试在隔离内使用流时,我遇到了一个奇怪的问题, 如果我尝试这样的事情

main() async {
  await Isolate.spawn(entryPoint, null);
}

entryPoint(SendPort sendPort) {
  getStreamOfNumbers().listen((data) => print('data : $data'));
}

Stream<int> getStreamOfNumbers() async* {
  for (int x = 0; x < 10; x++) yield x;
}

没有任何东西打印到控制台中,但是如果我在主方法中添加一个接收端口,它就可以正常工作 ,即使我不使用接收端口

 main() async {
  ReceivePort receivePort = ReceivePort();
  await Isolate.spawn(entryPoint, null);
}

//the output is : 
//data : 0
//data : 1
//data : 2
//data : 3
//data : 4
//data : 5
//data : 6
//data : 7
//data : 8
//data : 9

这是一个错误还是我有什么问题?

【问题讨论】:

    标签: dart stream stdin dart-isolates


    【解决方案1】:

    您第一个示例中的问题是您没有等待隔离在您的主线程/隔离中完成。当主线程/隔离没有任何事情可做并且事件队列为空时,Dart 退出。

    在您的下一个示例中,它“有效”,但您没有说的是程序永远不会退出。那是因为您创建了一个没有侦听器的 ReceivePort,这会阻止主线程/隔离停止,因为它现在永远等待。

    如果您改为以这种方式使用 ReceivePort,您可以使用它来等待隔离完成,并且仅在发生这种情况时退出主循环:

    import 'dart:isolate';
    
    Future<void> main() async {
      final rPort = ReceivePort();
      await Isolate.spawn(entryPoint, null, onExit: rPort.sendPort);
      await rPort.first;
    }
    
    void entryPoint(SendPort sendPort) {
      getStreamOfNumbers().listen((data) => print('data : $data'));
    }
    
    Stream<int> getStreamOfNumbers() async* {
      for (var x = 0; x < 10; x++) {
        yield x;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多