Isolate

作者: 旺仔_100 | 来源:发表于2021-06-14 22:30 被阅读0次

    在Dart中并发是通过Isolate来实现的。Isolate和线程的区别是它不共享内存。
    Dart VM中采用了多生代算法进行垃圾回收。

    主Isolate和创建的Isolate之间是通过管道进行通信的,而且还是单向的。如果需要结果回传还需要创建另一个管道,十分繁琐。
    dart中封装了这个双向管道通信:compute。

    
    Isolate isolate;
    
    start() async {
      ReceivePort receivePort= ReceivePort();//创建管道
      //创建并发Isolate,并传入发送管道
      isolate = await Isolate.spawn(getMsg, receivePort.sendPort);
      //监听管道消息
      receivePort.listen((data) {
        print('Data:$data');
        receivePort.close();//关闭管道
        isolate?.kill(priority: Isolate.immediate);//杀死并发Isolate
        isolate = null;
      });
    }
    //并发Isolate往管道发送一个字符串
    getMsg(sendPort) => sendPort.send("Hello");
    
    
    //并发计算阶乘
    Future<dynamic> asyncFactoriali(n) async{
      final response = ReceivePort();//创建管道
      //创建并发Isolate,并传入管道
      await Isolate.spawn(_isolate,response.sendPort);
      //等待Isolate回传管道
      final sendPort = await response.first as SendPort;
      //创建了另一个管道answer
      final answer = ReceivePort();
      //往Isolate回传的管道中发送参数,同时传入answer管道
      sendPort.send([n,answer.sendPort]);
      return answer.first;//等待Isolate通过answer管道回传执行结果
    }
    
    //Isolate函数体,参数是主Isolate传入的管道
    _isolate(initialReplyTo) async {
      final port = ReceivePort();//创建管道
      initialReplyTo.send(port.sendPort);//往主Isolate回传管道
      final message = await port.first as List;//等待主Isolate发送消息(参数和回传结果的管道)
      final data = message[0] as int;//参数
      final send = message[1] as SendPort;//回传结果的管道 
      send.send(syncFactorial(data));//调用同步计算阶乘的函数回传结果
    }
    
    //同步计算阶乘
    int syncFactorial(n) => n < 2 ? n : n * syncFactorial(n-1);
    main() async => print(await asyncFactoriali(4));//等待并发计算阶乘结果
    
    
    //同步计算阶乘
    int syncFactorial(n) => n < 2 ? n : n * syncFactorial(n-1);
    //使用compute函数封装Isolate的创建和结果的返回
    main() async => print(await compute(syncFactorial, 4));
    

    相关文章

      网友评论

          本文标题:Isolate

          本文链接:https://www.haomeiwen.com/subject/zaclkltx.html