Dart中等待Isolate终止的实现方案咨询
解决Dart主应用启动Isolate后直接退出的问题
你可以通过监听每个子Isolate的退出事件,等待所有Isolate终止后再让主应用退出,替代冗余的while(true)循环。具体实现如下:
1. 修改Server类,跟踪并等待所有Isolate终止
调整start方法使其返回Future<void>,当所有子Isolate退出时完成:
import 'dart:io'; import 'dart:isolate'; class Server { final int port; final int isolateCount; Server(this.port, this.isolateCount); Future<void> start() async { final exitCompleters = <Completer<void>>[]; for (var i = 0; i < isolateCount; i++) { final completer = Completer<void>(); exitCompleters.add(completer); // 创建接收端口监听Isolate退出信号 final exitPort = ReceivePort(); // 启动Isolate并绑定退出通知端口 final isolate = await Isolate.spawn( _runHttpServer, port, onExit: exitPort.sendPort, debugName: 'ServerIsolate_$i', ); // 收到退出信号时完成completer并关闭端口 exitPort.listen((_) { completer.complete(); exitPort.close(); }); } // 等待所有Isolate的退出信号 await Future.wait(exitCompleters.map((c) => c.future)); } static void _runHttpServer(int port) async { // 启动HTTP服务器示例逻辑 final server = await HttpServer.bind(InternetAddress.anyIPv4, port); print('Isolate ${Isolate.current.debugName} running on port $port'); await for (final request in server) { request.response ..statusCode = HttpStatus.ok ..write('Response from ${Isolate.current.debugName}') ..close(); } } }
2. 简化主函数
移除冗余循环,直接await Server的start方法:
void main() async { final httpServer = Server(8080, 3); await httpServer.start(); // 所有Isolate终止后,主应用自动退出 }
核心逻辑说明
- 每个Isolate启动时通过
onExit参数绑定ReceivePort,Isolate终止时会向该端口发送信号。 - 用
Completer跟踪每个Isolate的退出状态,通过Future.wait等待所有Completer完成,确保主Isolate不会提前退出。 - 只有当所有HTTP服务器关闭(对应Isolate终止)后,主应用才会结束运行。
内容的提问来源于stack exchange,提问作者MultiTasker
相关产品推荐
相关产品推荐

