dart 中的 compute

359 阅读2分钟

上篇文章写了Isolate的用法, Isolate的操作是非常底层的,使用起来相对而言会比较麻烦。Dart官方为了方便开发者使用多线程,还提供了compute接口。compute是对Isolate的更高级的封装,相对于Isolate而言,compute的使用更简单更轻量。

compute()

compute 是对Isolate的封装,Isolate和其它的线程之间的通信需要通过端口,Compute 是通过 Isolate.spawn()  方式来处理 Isolate 其中 compute()  方法中在通讯结束后自动进行 Isolate.kill()销毁;且 compute()  直接返回内容,无需考虑 listen监听等;

直接通过返回一个future函数来获取处理后的值。需要注意的是,callback传递给它的函数必须是顶层函数或静态函数,因为后台隔离线程无法访问非静态变量或实例变量。下面是compute()函数的定义。callback就是需要初始化注册的回调函数,message 传给 callback回调函数的参数,R 是返回值类型, Q是函数的参数类型。

Future<R> compute<Q, R>(isolates.ComputeCallback<Q, R> callback, Q message, { String? debugLabel })

例子

返回布尔值的compute()函数,

Future<bool> isPrime(int value) {
   return compute的使用,(_calculate, value); // compute的使用,
}
bool _calculate(int value) {
   if (value == 1) {
     return false;
   }
   for (int i = 2; i < value; ++i) {
     if (value % i == 0) {
      return false;
     }
   }
   return true;
}

使用场景

  • 方法执行在几毫秒或十几毫秒左右的,应使用Future
  • 如果一个任务需要几百毫秒或之上的,则建议compute(只有一次返回)或Isolate(用于订阅或有多次返回的)

总结

在计算机上,对于同一个计算,我们想要更快的得到计算结果,那么就需要占用更多的资源,因此只有那些非常复杂耗时的计算我们才会去考虑使用多线程,方式就是Isolate或者compute。尽管我们可以使用Isolate或者compute来实现类似于多线程的功能,但是它更像进程而非线程,因此Isolate的使用是很占内存的,所以非必要不使用。