为什么 Dart isolates 中的流在没有接收端口的情况下无法工作
Why streams in Dart isolates doesn't work without receive port
当我尝试在 isolate 中使用流时,我遇到了一个奇怪的问题,
如果我尝试这样的事情
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;
}
控制台中没有打印任何内容,但如果我在主要方法中添加一个接收端口,它就可以正常工作
,即使我不使用接收端口[=12=]
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
这是一个错误还是我有什么问题?
第一个示例中的问题是您没有等待隔离在您的主 thread/isolate 中完成。当主要 thread/isolate 无事可做且事件队列为空时,Dart 退出。
在你的下一个例子中它 "works" 但你没有说的是程序永远不会退出。那是因为您创建了一个没有侦听器的 ReceivePort,这会阻止主 thread/isolate 停止,因为它现在会永远等待。
如果您改为以这种方式使用 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;
}
}
当我尝试在 isolate 中使用流时,我遇到了一个奇怪的问题, 如果我尝试这样的事情
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;
}
控制台中没有打印任何内容,但如果我在主要方法中添加一个接收端口,它就可以正常工作 ,即使我不使用接收端口[=12=]
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
这是一个错误还是我有什么问题?
第一个示例中的问题是您没有等待隔离在您的主 thread/isolate 中完成。当主要 thread/isolate 无事可做且事件队列为空时,Dart 退出。
在你的下一个例子中它 "works" 但你没有说的是程序永远不会退出。那是因为您创建了一个没有侦听器的 ReceivePort,这会阻止主 thread/isolate 停止,因为它现在会永远等待。
如果您改为以这种方式使用 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;
}
}