关于dart单线程的理解

2022-09-07  本文已影响0人  晨曦中的花豹
dart的单线程丝毫没有任何优势可言

关于dart很不好理解的一个地方就是,它是单线程的,如何来处理耗时操作呢?,网上搜索到的都是在说io,网络请求,而这些操作都是只需要发起而不需要我自己做的,或者必需要一直等待的,比如我定外卖,点完之后我就可以放下手机去干别的事情,到时候送过来,我就可以直接吃了,所以对于这样的问题dart单线程是丝毫没有影响的,它只需要触发这个任务,对应模块处理完成后回调告诉它就可以了,但是如果这件事情必须要自己处理,比如我有一个任务整体耗时需要1s,即使我将它放到异步去处理,他还是会占用当前的线程1s,而这1s线程是不能处理别的任务的,导致的结果就是,页面会卡死,比如这段代码,loading图标会卡死

@override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      // appBar: AppBar(
      //   title: Text("ceshi"),
      // ),
      body: Center(
        child: CircularProgressIndicator(
          valueColor: AlwaysStoppedAnimation<Color>(Colors.black),
          strokeWidth: 2,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Text("按钮"),
        onPressed: () async {
          sleep(Duration(seconds: 1));
        },
      ),
    );
  }

所以dart的单线程适用范围是比较窄的,不能像原生一样开启子线程那样灵活自如

iOS多线程与dart单线程对比:

在iOS中有一个主线程(UI线程),需要执行耗时操作通常会开启子线程去处理,而dart中没有子线程,只有特定的几个场景有对应的模块执行而已,所以原生相当于可以随时创建出手臂,用来处理任何耗时操作,而dart只有出厂安装好的几个手臂,如果想干别的耗时操作,只能是通过Isolate来完成,而Isolate并不如子线程那样舒适.

所以这样理解后会发现他就相当于原生的UI线程,也只能是线性的执行任务,网上说的dart单线程多么厉害,看看就好了

关于Isolate他还不能简单的认为是dart中的多线程,首先通过测试,创建一个Isolate耗时很严重,跟原生(比如GCD)的性能差距很大,其次数据不共享,要通过通信方式传递参数,非常不方便,最后是代码量,写一个简单的Isolate通信需要写很多代码,而GCD就显得从容了很多

DispatchQueue.global().async {
        //异步执行任务
        DispatchQueue.main.async {
            //回调主线程
        }

      }

所以对于dart单线程我没有感觉到任何的优点,反而是复杂操作,远不如原生灵活

我觉得如果dart引入子线程会更加的好用
上一篇下一篇

猜你喜欢

热点阅读