关于php:持续发烧聊聊Dart语言的并发处理能挑战Go不

30次阅读

共计 4026 个字符,预计需要花费 11 分钟才能阅读完成。

前言

貌似对于 Dart 的文章没流量啊,就算在小编关心上了首页,看得人还是很少的。

算了,明天继续发烧,再来写写如何应用 Dart 语言的并发操作。说起并发操作,玩 Go 的同学该笑了,这就是咱们的看家本领啊。玩 PHP 的同学持续看看,示意咱们光看不谈话。

代码演示之前,咱们先假如一个场景。假如我有一些漂亮妹妹,他们要出门旅行了,旅行的时候会发照片给我。在这里个过程中,代码须要做的事件:

  1. 接管申请
  2. 安顿出行打算, 同时出行哦, 不能有先后之分
  3. 他们各自出行,能够发照片给我
  4. 返回后果

这个过程中,我关怀的是他们能不能解决好本人的事件,因为我妹妹太多了,如果都让我帮他们,累死我也搞不定啊,我就干两件事,安顿好出行打算,最初收照片。

代码演示一下吧

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.862973
2021-07-01 15:50:57.924675_onCompletedItem is ok
2021-07-01 15:50:57.954982_onCompletedItem is ok
2021-07-01 15:50:57.986042_onCompletedItem is ok
2021-07-01 15:50:58.021282_onCompletedItem is ok
2021-07-01 15:50:58.053387_onCompletedItem is ok
2021-07-01 15:50:58.088492_onCompletedItem is ok
2021-07-01 15:50:58.121968_onCompletedItem is ok
2021-07-01 15:50:58.157117_onCompletedItem is ok
2021-07-01 15:50:58.190835_onCompletedItem is ok
2021-07-01 15:50:58.229044_onCompletedItem is ok
2021-07-01 15:50:58.241011_onCompletedAll

能够看到,两头每一个工作实现的工夫,都很靠近,并发解决很完满

总结

当须要解决很多工作时,能够开拓多个隔离区,并发执行,提高效率。

Dart语言对并发的解决,还算人性化,了解起来没有难度,用起来也容易。

同学们,骚起来吧。

正文完
 0