前言
貌似对于Dart
的文章没流量啊,就算在小编关心上了首页,看得人还是很少的。
算了,明天继续发烧,再来写写如何应用 Dart
语言的并发操作。说起并发操作,玩 Go
的同学该笑了,这就是咱们的看家本领啊。玩 PHP
的同学持续看看,示意咱们光看不谈话。
代码演示之前,咱们先假如一个场景。假如我有一些漂亮妹妹,他们要出门旅行了,旅行的时候会发照片给我。在这里个过程中,代码须要做的事件:
- 接管申请
- 安顿出行打算,同时出行哦,不能有先后之分
- 他们各自出行,能够发照片给我
- 返回后果
这个过程中,我关怀的是他们能不能解决好本人的事件,因为我妹妹太多了,如果都让我帮他们,累死我也搞不定啊,我就干两件事,安顿好出行打算,最初收照片。
代码演示一下吧
import 'dart:io';import 'dart:isolate';main() async { print(DateTime.now().toString() + ' 开始'); //这是一个接管端口,能够了解成我的手机 ReceivePort receivePort = new ReceivePort(); //安顿三个妹妹进来旅行,让她们牢记我的手机号 await Isolate.spawn(travelToBeijing, receivePort.sendPort); await Isolate.spawn(travelToShanghai, receivePort.sendPort); await Isolate.spawn(travelToGuangzhou, receivePort.sendPort); //我就在手机上,期待他们的音讯 receivePort.listen((message) { print(message); }); print(DateTime.now().toString() + ' 完结');}void travelToBeijing(SendPort sendPort) { sleep(Duration(seconds: 3)); sendPort.send(DateTime.now().toString() + ' 我是妹妹1,我在北京了');}void travelToShanghai(SendPort sendPort) { sleep(Duration(seconds: 3)); sendPort.send(DateTime.now().toString() + ' 我是妹妹2,我在上海了');}void travelToGuangzhou(SendPort sendPort) { sleep(Duration(seconds: 3)); sendPort.send(DateTime.now().toString() + ' 我是妹妹3,我在广州了');}
下面写了那么多,都是啥意思呢,我本人略微解释下下面的代码。
Dart
里的并发,用到的是 Isolate
类。
Isolate
翻译过去即是 隔离区
, 是 Dart
实现并发的重要类。它并发的原理,既不是多过程,也不是多线程,你说相似于 Go
的协程吧,也不像。
真的很难定义它,期待对操作系统钻研更深的同学来布道,当然这不影响咱们应用。
Isolate.spawn
来定义一个并发工作,接管两个参数,第一个是该工作的处理函数,第二个是该处理函数的所须要的参数
ReceivePort
翻译一下 接管端口
, 也能够翻译成 接收器
,用来接管各个工作回传的音讯。
receivePort.listen
用来监听各工作的回传信息,代码里只是简略打印
执行它,失去打印的后果
2021-07-01 15:40:38.132122 开始2021-07-01 15:40:38.295683 完结2021-07-01 15:40:41.200316 我是妹妹1,我在北京了2021-07-01 15:40:41.248851 我是妹妹2,我在上海了2021-07-01 15:40:41.296737 我是妹妹3,我在广州了
留神看打印后果,妹妹们很乖,根本在同一时间给我回复了音讯。总共工夫差不多3秒钟,你能够增加更多任务,都会是3秒钟。
再次封装一下
理论应用的时候,咱们能够再次封装,应用的同学不必去想 Isolate
, ReceivePort
都是什么鬼
import 'dart:io';import 'dart:isolate';class MultiTask { static void run( {List<TaskItem> taskList, Function taskFunc, Function onCompletedItem, Function onCompletedAll}) async { ReceivePort receivePort = new ReceivePort(); Map<String, Isolate> mapParam = {}; for (int i = 0; i < taskList.length; i++) { TaskItem taskItem = taskList[i]; mapParam[taskItem.key] = await Isolate.spawn( taskFunc, TaskMessage(receivePort.sendPort, taskItem)); } List<TaskRes> taskResList = []; receivePort.listen((message) async { TaskRes taskRes = message as TaskRes; if (null != onCompletedItem) await onCompletedItem(taskRes); taskResList.add(taskRes); mapParam[taskRes.key].kill(); if (taskResList.length == taskList.length) { receivePort.close(); if (null != onCompletedAll) await onCompletedAll(taskResList); } }); }}class TaskMessage { SendPort sendPort; TaskItem taskItem; TaskMessage(this.sendPort, this.taskItem);}class TaskItem { String key; String param; TaskItem(this.key, this.param);}class TaskRes { String key; String res; TaskRes(this.key, this.res);}
应用的时候,这样来:
import 'dart:io';import 'dart:isolate';import 'MultiTask.dart';main() async { List<TaskItem> taskList = [ 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'), ]; print(DateTime.now()); MultiTask.run( taskList: taskList, taskFunc: taskFunc, onCompletedItem: (TaskRes taskRes) => print(DateTime.now().toString() + '_' + taskRes.res), onCompletedAll: (List<TaskRes> taskResList) => print(DateTime.now().toString() + '_onCompletedAll'), );}void taskFunc(TaskMessage taskMessage) async { sleep(Duration(seconds: 3)); String res = 'onCompletedItem is ok'; taskMessage.sendPort.send(TaskRes(taskMessage.taskItem.key, res));}
走起来吧
2021-07-01 15:50:54.8629732021-07-01 15:50:57.924675_onCompletedItem is ok2021-07-01 15:50:57.954982_onCompletedItem is ok2021-07-01 15:50:57.986042_onCompletedItem is ok2021-07-01 15:50:58.021282_onCompletedItem is ok2021-07-01 15:50:58.053387_onCompletedItem is ok2021-07-01 15:50:58.088492_onCompletedItem is ok2021-07-01 15:50:58.121968_onCompletedItem is ok2021-07-01 15:50:58.157117_onCompletedItem is ok2021-07-01 15:50:58.190835_onCompletedItem is ok2021-07-01 15:50:58.229044_onCompletedItem is ok2021-07-01 15:50:58.241011_onCompletedAll
能够看到,两头每一个工作实现的工夫,都很靠近,并发解决很完满
总结
当须要解决很多工作时,能够开拓多个隔离区,并发执行,提高效率。
Dart
语言对并发的解决,还算人性化,了解起来没有难度,用起来也容易。
同学们,骚起来吧。