范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

dart系列之dart优秀的秘诀隔离机制

  简介
  之前介绍了很多dart中的异步编程技巧,不知道大家有没有发现一个问题,如果是在java的异步编程中,肯定会提到锁和并发机制,但是对于dart来说,好像从来没有听到多线程和并发的问题,这是为什么呢?
  今天,给大家讲解一下dart中的隔离机制,大家就明白了。 dart中的隔离机制
  dart是一个单线程的语言,但是作为一个单线程的语言,dart却支持Future,Stream等异步特性。这一切都是隔离机制和事件循环带来的结果。
  首先看一下dart中的隔离机制。
  所谓隔离指的是dart运行的一个特定的空间,这个空间拥有单独的内存和单线程的事件循环。
  如下图所示:
  在java或者c++等其他语言中,多个线程是共享内存空间的,虽然带来了并发和数据沟通的方便途径,但是同时也造成了并发编程的困难。
  因为我们需要考虑多线程之间数据的同步,于是额外多出了很多锁的机制,详细了解或者用过的人应该都会很烦恼。
  多线程最大的缺陷就是要求程序员的罗辑思维和编程技巧足够优秀,这样才能够设计出完美运行的多线程程序。
  但是在dart中,这些都不是什么问题。dart中所有的线程都拥有自己的运行空间,这个线程的工作就是运行事件循环。
  那么问题来了,主线程在处理事件循环,但是如果遇到了一个非常耗时的操作,该怎么办呢? 如果直接在主线程中运行,则可能会导致主线程的阻塞。
  dart也充分考虑到了这个问题,所以dart提供了一个Isolate的类来对隔离进行管理。
  因为dart程序本身就在一个Isolate中运行,所以如果在dart中定义一个Isolate,那么这个Isolate通常表示的是另外一个,需要和当前Isolate进行通信的Isolate。 生成一个Isolate
  那么如何在当前的dart程序中生成一个Isolate呢?
  Isolate提供了三种生成方法。
  一个非常常用的是Isolate的工厂方法spawn:   external static Future spawn(       void entryPoint(T message), T message,       {bool paused = false,       bool errorsAreFatal = true,       SendPort? onExit,       SendPort? onError,       @Since("2.3") String? debugName});
  spawn会创建一个新的Isolate,调用它需要传入几个参数:
  entryPoint表示的是生成新Isolate的时候需要调用的函数。entryPoint接受一个message参数。通常来说message是一个SendPort对象,用于两个Isolate之间的沟通。
  paused表示新生成的Isolate是否处于暂停状态,他相当于: isolate.pause(isolate.pauseCapability)
  如果后续需要取消暂停状态,则可以调用: isolate.resume(isolate.pauseCapability)
  errorsAreFatal 对应的是setErrorsFatal方法。
  onExit对应的是addOnExitListener, onError对应的是addErrorListener。
  debugName表示的是Isolate在调试的时候展示的名字。
  如果spawn出错,则会抛出IsolateSpawnException异常: class IsolateSpawnException implements Exception {   /// Error message reported by the spawn operation.   final String message;   @pragma("vm:entry-point")   IsolateSpawnException(this.message);   String toString() => "IsolateSpawnException: $message"; }
  spawn方法生成的是和当前代码一样的Isolate。如果想要使用不同的代码来生成,则可以使用spawnUri,通过传入对应的Uri地址,从而生成不一样的code。 external static Future spawnUri(       Uri uri,       List args,       var message,       {bool paused = false,       SendPort? onExit,       SendPort? onError,       bool errorsAreFatal = true,       bool? checked,       Map? environment,       @Deprecated("The packages/ dir is not supported in Dart 2")           Uri? packageRoot,       Uri? packageConfig,       bool automaticPackageResolution = false,       @Since("2.3")           String? debugName});
  还有一种方式,就是使用Isolate的构造函数: Isolate(this.controlPort, {this.pauseCapability, this.terminateCapability});
  它有三个参数,第一个参数是controlPort,代表另外一个Isolate的控制权,后面两个capabilities是原isolate的子集,表示是否有pause或者terminate的权限。
  一般用法如下: Isolate isolate = findSomeIsolate(); Isolate restrictedIsolate = Isolate(isolate.controlPort); untrustedCode(restrictedIsolate); Isolate之间的交互
  所有的dart代码都是运行在Isolate中的,然后代码只能够访问同一个isolate内的class和value。那么多个isolate之间通信,可以ReceivePort和SendPort来实现。
  先看下SendPort,SendPort是Capability的一种: abstract class SendPort implements Capability
  SendPort用于向ReceivePort发送message, message可以有很多类型,包括:
  Null,bool,int,double,String,List,Map,TransferableTypedData,SendPort和Capability。
  注意,send动作是立马完成的。
  事实上,SendPort是由ReceivePort来创建的。一个ReceivePort可以接收多个SendPort。
  ReceivePort是Stream的一种: abstract class ReceivePort implements Stream
  作为Stream,它提供了一个listen用来处理接收到的消息:   StreamSubscription listen(void onData(var message)?,       {Function? onError, void onDone()?, bool? cancelOnError}); 一个例子
  讲了那么多原理,有的同学可能会问了,那么到底怎么用呢?
  例子来了: import "dart:isolate";  var isolate;  void entryPoint(SendPort sendPort) {   int counter = 0;   sendPort.send("counter:counter"); } void main() async{   final receiver = ReceivePort();   receiver.listen((message) {     print( "接收到消息message");   });   isolate = await Isolate.spawn(entryPoint, receiver.sendPort); }
  在主线程中,我们创建了一个ReceivePort,然后调用了它的listen方法来监听sendPort发过来的消息。
  然后spawn出一个新的Isolate,这个Isolate会在初始化之后,调用entryPoint方法。
  在这个entryPoint方法中又使用sendPort向ReceivePort发送消息。
  最终运行,打印: 接收到消息 counter:0 总结
  以上就是dart中的隔离机制和Isolate的使用。 本文已收录于 http://www.flydean.com/25-dart-isolates/
  最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
  欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

红米note7Pro拍照,谷歌算法就是不一般鉴于之前那个动态对焦点不一致导致对比失衡,再来一组,谷歌相机默认4800w,我换成了1200w。这次对焦都是一个点,尽量手不抖了,回头我用支架试试14800w2谷歌hdr3谷歌夜景CPU惊喜,GPU入坑!高通骁龙675实测骁龙660是高通在2017年发布的神U,它堪称骁龙625的完美接班人,提供了足够强的性能和较低的功耗,至今仍在千元价位贡献力量。如今,骁龙660的接班人骁龙675终于量产,并已经被中国移动正式向电信亮剑!宽带用户碾压中国电信!提及中国的宽带用户,原本以为是中国电信的老大地位,可现在看来,这个梗已经过去了。今晚,中国移动是再次对中国电信亮剑了!相关数据显示移动客户总数超过9。29亿户,当月净增用户109。亚马逊上架最便宜新kindle,内置阅读灯超长续航点击右上角关注我们,每天给您带来最新最潮的科技资讯,让您足不出户也知道科技圈大事!近日,亚马逊上架一款Kindle电子书阅读器青春版,拥有黑白两色,售价为658元。目前已开启预售,阿里达摩院去年芯片卖出2亿片首款自研NPU年内发布性能领先10倍3月21日,阿里云峰会上,阿里巴巴CTO阿里云总裁张剑锋表示,达摩院成立三年以来发展迅速,去年销售芯片超两亿片,并且将在今年发布首款自主研发NPU,性能领先10倍。张剑锋表示,我们固态界小米来袭,阿斯加特消费级超大容量2TBSSD曾经的智能手机一直被国外品牌所垄断,价格长久的高高在上,直到小米手机杀出,搅动整个手机市场,以卓越的性能和超低的价格,倒逼国外手机一步步走向低价,如今国产手机疯狂进步,带来的国产品单盘3。84TB!金士顿发大容量企业级固态硬盘作为消费级存储巨头的金士顿并同样在发展企业级存储产品,近日金士顿就发布了DC500企业级SATA固态硬盘。DC500分为DC500R和DC500M两个系列,分别针对读取密集型和混合springcloudfeign实现原理,如何实现负载均衡?首先说明一下,feign只是一个声明式的Http客户端,提供以声明式的方式定义Http调用。本身并没有实现负载均衡,负载均衡是ribbon实现的,feign只是使用而已。我从不使用固态界小米来袭,阿斯加特消费级超大容量2TBSSD曾经的智能手机一直被国外品牌所垄断,价格长久的高高在上,直到小米手机杀出,搅动整个手机市场,以卓越的性能和超低的价格,倒逼国外手机一步步走向低价,如今国产手机疯狂进步,带来的国产品iPhone降价为啥还没人买?这三个问题是关键作为全球智能机领域的巨头之一,苹果这两年在国内市场并不好过,由于受到多重因素的影响,苹果手机销量与市场份额均出现了不断下滑的趋势。2019年第一财季苹果的营收出现了比较明显的下滑,又一家攻克14nmFinFET工艺的国产晶圆代工厂来了,明年底量产在半导体设计制造及封测三大领域中,国内公司最薄弱的环节是半导体制造,目前英特尔三星台积电三大公司的制造工艺已经微缩到了14nm10nm及7nm节点,国内最大的晶圆代工厂中芯国际目前
盘点电脑圈,那些亲如兄弟的硬件品牌,有的连售后电话都一样说到目前的电脑硬件行业,各个品牌的竞争已经日趋白热化,也给消费者选择带来了很多的困难。今天蜗牛就给大家盘点一下,那些挂着不同品牌,实际几乎一样的品牌1影驰和耕升,亲兄弟品牌影驰和耕手机可以整晚充电吗?影响有多大?看完吓出一身冷汗虽然手机有了快充的加持,可以很好地解决我们的充电焦虑,但很多人会习惯在睡觉时给手机充电,而且一充就是一整晚。有小伙伴认为,给手机充电一整晚非常危险,搞不好会出事真的是这样吗?长时间曝光整体得到升级华为P60Pro,华为P50再创超低价,创百元新神话曝光预计将会在2022年9月份正式亮相的华为P60Pro神机的整体升级确实不小,曝光预计将会在2022年9月份正式亮相的华为P60Pro神机系统影像期待值满满曝光预计将会在2022单片机为什么不到一年时间涨这么多?核心原因就是供不应求,全球缺芯。前段时间,上家公司老板找我问了下以前产品的问题,顺势就聊聊大家最近在做的事,做得如何之类的话。听老板语气都感觉有气无力的,其实不用他说,我都知道,前6万人参与砍一刀不成功,拼多多变成骗多多了吗?拼多多里面套路很多,就像现在的看视频攒金币,开始一万,容易,后来难度加大,要二万,三万涨到七万才能兑换一块,也是醉了,经历过的人都懂,想要那二十块,让你付出无法磨灭的印记我个人认为最近海尔品牌的冰箱热水器是不是质量严重下滑啦?自动加热功能经常失灵,意思是说不能加热?还是说一直在不停加热?检查一下热水器漏电保护器是否跳闸,找找热水器上的复位键进行复位,或者更换漏电保护器。外部原因也会导致热水器不加热,比如我想找回我删掉的微信朋友,该怎么办?恢复技巧一学会使用手机号恢复微信好友删除后,你首先确定删除好友的身份,是网络好友还是现实生活中的好友呢?如果现实生活中的好友,比如同学亲属朋友等,这恢复起来就比较简单,因为我们手机你有每天吃苹果的习惯吗?吃苹果的好处有哪些?能说说吗?我每天吃一到两个苹果,吃了20多年了,小时候家里穷没有吃,长大结婚后来深圳才开始吃苹果。吃苹果的好处还非常多呢?比如坚持每天吃苹果的人皮肤有弹性,看起来皮肤光泽有水分,对身体免疫力物理学家发现,电脑里的文件多了也会让地球的质量变重?呃,好的,那电脑硬盘里少存一点东西,万一把桌子压坏了在24小时内,人们在全球视频网站上传的视频时常就有几千万小时之多。研究发现,这些数以亿计的音视频文件消息以及其它文件,可以使地球卡西欧的太阳能卫星对时手表天气逐渐变暖了,户外活动时又翻出了我的卡西欧手表。型号为GWP2000。我这个是橙色,这个系列还有一个蓝色的。表的正面这个表支持GPS无线电波和蓝牙连接三种功能,能够在世界上任何地周一股票利好消息3月2527日,中国电动汽车百人会论坛(2022)召开这次论坛明确了我国新能源汽车发展的规模和远大目标,进一步探讨车路协同技术与产业化发展。高度关注动力电池原材料涨价问题。打击囤货