当前位置: 首页 > 后端技术 > PHP

继续发烧,说说Dart语言的并发处理,你能挑战Go吗?

时间:2023-03-30 00:48:33 PHP

前言关于Dart的文章好像没什么流量。即使小编很在意首页,但看的人还是很少。算了,今天继续发烧,以后写写Dart语言并发操作的使用方法。说起并发操作,下围棋的同学应该笑了,这就是我们的看家本领。玩PHP的同学继续看,说我们只看不说。在代码演示之前,我们先假设一个场景。假设我有一些漂亮的姐妹要去旅行,她们在旅行时给我发照片。在这个过程中,代码需要做的事情:接收请求安排出行计划,同时出行。不能有优先权。他们分开旅行。他们可以将照片发送给我并返回结果。在这个过程中,我关心的是他们能不能搞定。自己的事情自己管好,因为妹妹太多了,要是都让我帮忙,累死我也应付不来,所以我会做两件事,安排行程,还有最后收集照片。让我们演示代码import'dart:io';import'dart:isolate';main()async{print(DateTime.now().toString()+'start');//这是一个接收端口,可以理解成为我的手机ReceivePortreceivePort=newReceivePort();//安排三个小姐姐去旅游,让她们记住我的手机号awaitIsolate.spawn(travelToBeijing,receivePort.sendPort);awaitIsolate.spawn(travelToShanghai,receivePort.sendPort);awaitIsolate.spawn(travelToGuangzhou,receivePort.sendPort);//我正在打电话,等待他们的消息receivePort.listen((message){print(message);});print(DateTime.now().toString()+'end');}voidtravelToBeijing(SendPortsendPort){sleep(Duration(seconds:3));sendPort.send(DateTime.now().toString()+'我是姐姐1,我在北京了');}voidtravelToShanghai(SendPortsendPort){sleep(Duration(seconds:3));sendPort.send(DateTime.now().toString()+'我是二姐,我在上海');}voidtravelToGuangzhou(SendPortsendPort){sleep(Duration(seconds:3));sendPort.send(DateTime.now().toString()+'我是3姐,我在广州');}上面写了这么多,什么意思?让我自己稍微解释一下上面的代码。Dart中的并发使用Isolate类。Isolate译为隔离区,是Dart实现并发的重要类。它的并发原理既不是多进程也不是多线程。你说它像Go的协程,其实又不像。真的很难定义,期待对操作系统有更深入了解的同学布道。当然,这并不影响我们的使用。isolate.spawn定义一个并发任务,接收两个参数,第一个是任务的处理函数,第二个是处理函数需要的参数ReceivePort翻译接收端口,也可以翻译成receiver,使用接收每个任务返回的消息。receivePort.listen用于监听各个任务的返回信息。该代码只是打印并执行它以获得打印结果。-0115:40:41.200316我是1姐,我在北京2021-07-0115:40:41.248851我是2姐,我在上海2021-07-0115:40:41.296737我是3姐,我在广州,关注打印结果。姐妹们都很好,基本同时回复我。总时间大概是3秒,你可以增加任务,就是3秒。再封装一下,等我们真正用到的时候再封装一下,使用的同学就不用考虑Isolate和ReceivePort了。import'dart:io';import'dart:isolate';classMultiTask{staticvoidrun({ListtaskList,FunctiontaskFunc,FunctiononCompletedItem,FunctiononCompletedAll})async{ReceivePortreceivePort=newReceivePort();MapmapParam={};for(inti=0;itaskResList=[];receivePort.listen((message)async{TaskRestaskRes=messageasTaskRes;if(null!=onCompletedItem)awaitonCompletedItem(taskRes);taskResList.add(taskRes);mapParam[taskRes.key].kill();if(taskResList.length==taskList.length){receivePort.close();if(null!=onCompletedAll)awaitonCompletedAll(taskResList);}});}}classTaskMessage{SendPort发送端口;任务项任务项;TaskMessage(this.sendPort,this.taskItem);}classTaskItem{字符串键;字符串参数;TaskItem(this.key,this.param);}classTaskRes{字符串键;字符串资源;TaskRes(this.key,this.res);=[TaskItem('1','param1'),TaskItem('2','param2'),TaskItem('3','param1'),TaskItem('4','param2'),TaskItem('5','param1'),TaskItem('6','param2'),TaskItem('7','param1'),TaskItem('8','param2'),TaskItem('9','param1'),TaskItem('0','param2'),];打印(日期时间。现在());MultiTask.run(taskList:taskList,taskFunc:taskFunc,onCompletedItem:(TaskRestaskRes)=>print(DateTime.now().toString()+'_'+taskRes.res),onCompletedAll:(ListtaskResList)=>打印(日期时间.now().toString()+'_onCompletedAll'),);}voidtaskFunc(TaskMessagetaskMessage)async{sleep(Duration(seconds:3));Stringres='onCompletedItem没问题';taskMessage.sendPort.send(TaskRes(taskMessage.taskItem.key,res));}让我们开始吧2021-07-0115:50:54.862973-07-0115:50:57.986042_onCompletedItem没问题2021-07-0115:50:58.021282_onCompletedItemisok2021-07-0115:50:58.053387_onCompletedItemisok2021-07-0115:50:58.088492_onCompletedItemisok2021-07-0115:50:58.121968_onCompletedItemisok2021-07-0115:50:58.157117_onCompletedItem是ok2021-07-0115:50:58.190835_onCompletedItem是ok2021-07-0115:50:58.229044_onCompletedItem是ok2021-07-0115:50:58.241011_onCompletedAll可以看到每个任务的中间完成时间很接近,并发处理很完美。小结当需要处理的任务较多时,可以开辟多个隔离区并发执行,提高效率。Dart语言支持并发处理,比较人性化,不难理解,使用方便。同学们,我们闹一下吧。