美文网首页Flutter
flutter中compute和isolate

flutter中compute和isolate

作者: xmb | 来源:发表于2021-03-19 13:38 被阅读0次
    • asyncawait
      对于普通的任务,使用asyncawait可实现异步处理任务,而async的处理方式并非使用的是多线程,而是依然在UI线程中处理任务,是在同一个线程上的并发操作。
      对于比较繁重的处理任务,可使用compute来开启新isolate,来处理任务。

    • isolate
      是类似于线程,但不共享内存的独立的worker。是一个独立的dart程序执行环境。
      对于每一个flutter应用,当应用被启动时都会有一个默认的isolate,称为root isolate。我们自己的代码默认情况下都在这个isolate中执行。

    dart中的isolate比较重量级,IsolateUI线程传输比较复杂,flutterfoundation中封装了一个轻量级的compute操作。

    • compute使用条件:
      1、传入的方法只能是顶级函数或static函数
      2、只有一个传入参数和一个返回值

    • compute使用:

    _count = await compute(countEven, 1000000000);
    

    每次调用,都相当于创建了一个isolate,如果频繁使用的话,CPU性能、内存占用消耗也很大。

    -isolate的使用:

    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int myCount = 0;
    
      void test() async {
        myCount = await isolateCountEven(100, 2);
        setState(() {});
      }
    
      // 计算偶数的个数
      static int countEven(int num1, int num2) {
        int count = 0;
        while (num1 > 0) {
          if (num1 % 2 == 0) {
            count++;
          }
          num1--;
    
          num1 -= num2;
          print('$count');
        }
        return count;
      }
    
      static Future<dynamic> isolateCountEven(int num1, int num2) async {
        final response = ReceivePort();
        await Isolate.spawn(countEvent2, response.sendPort);
    
        final sendPort = await response.first;
        final answer = ReceivePort();
        sendPort.send([answer.sendPort, num1, num2]);
        return answer.first;
      }
    
      static void countEvent2(SendPort port) {
        final rPort = ReceivePort();
        port.send(rPort.sendPort);
        rPort.listen((message) {
          final send = message[0] as SendPort;
          final n1 = message[1] as int;
          final n2 = message[2] as int;
          send.send(countEven(n1, n2));
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text('$myCount'),
                MaterialButton(
                  onPressed: test,
                  child: Text('点击按钮'),
                ),
              ],
            ),
          ),
        );
      }
    }
    
    • isolate使用优化:
      使用三方库isolate来创建isolate池,自动实现负载均衡。
      isolate: ^2.0.3

    1、创建指定个数的isolate

    Future<LoadBalancer> loadBalancer = LoadBalancer.create(2, IsolateRunner.spawn);
    

    2、使用

    int useLoadBalancer() async {
        final lb = await loadBalancer;
        int res = await lb.run<int, int>(_doSomething, 1);
        return res;
      }
    

    每个isolate中执行顺序:
    每次执行前先微任务队列判断有没有要处理,没有微任务再在event队列执行一个event任务,单个event任务处理完之后,再从头遍历微任务队列是否有新的微任务。


    7776337-244d682635d9b2f3.png

    微任务包括:

    创建微任务:

    scheduleMicrotask((){
          print("微任务2");
        });
    

    Flutter 事件机制 - Future 和 MicroTask 全解析
    flutter之-dart多线程isolate(二)

    相关文章

      网友评论

        本文标题:flutter中compute和isolate

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