Dart言语中的线程

Dart是一种针对客户端和服务器构建应用程序的开源编程言语。它能够在不同的平台上运转,包含Web、移动设备和桌面应用程序。在Dart中,线程是一个很重要的概念,它能够帮助开发者更好地管理程序的履行流程和提升应用程序的运转功率

线程是什么?

对于不了解线程的人来说,线程能够被看作是程序履行的流程。在一个程序中,能够将程序分为多个线程,每个线程履行不同的使命。通常来说,线程能够分为两种:主线程和子线程。主线程是程序的主要线程,它处理用户输入、向用户显现信息等;而子线程则是在主线程之外履行的线程,用于完结一些耗时或独立操作的使命。

Dart中的线程

在Dart中,线程被称为Isolate。每个Isolate都是一个独立的履行环境,拥有自己的履行栈和堆。不同的Isolate之间是彼此隔离的,它们之间不能共享内存,也不能直接通讯。要在不同的Isolate之间进行通讯,必须运用专门的通讯机制。

Dart供给了两种机制来创立Isolate:spawn()和spawnUri()。spawn()答应咱们从当前Isolate中创立一个新的Isolate,而spawnUri()则答应咱们从一个指定的URI中创立一个新的Isolate。无论是哪种机制,创立新Isolate的过程都是异步的,因此必须运用Future来管理它们的履行状况。

下面是一个运用spawn()创立Isolate的比如:


import 'dart:isolate';
main() {
 var receivePort = new ReceivePort();
 sendPort.send(receivePort.sendPort);
 receivePort.listen((msg) {
  print('received msg: $msg');
  receivePort.close();
 });

 Isolate.spawn(run, 'hello');
}
void run(String msg) {
 print('run: $msg');
 sendPort.send('world');
}

在这个比如中,咱们运用Isolate.spawn()办法创立了一个新的Isolate。这个Isolate会调用run()办法,并将字符串“hello”传递给它。在这个Isolate中,咱们将字符串“world”发送回主Isolate,并在接纳到回应后封闭接纳端口。

Dart中线程的通讯

正如前面所提到的,不同的Isolate之间不能直接通讯。为了实现Isolate之间的通讯,Dart供给了三种机制:SendPort、ReceivePort和Stream。

SendPort和ReceivePort是Isolate之间进行点对点通讯的最基本机制。SendPort用于向方针Isolate发送音讯,而ReceivePort用于接纳来自其他Isolate的音讯。运用SendPort和ReceivePort进行通讯的基本流程如下:

  1. 在发送方Isolate中创立一个ReceivePort,并获取其sendPort。

  2. 将sendPort发送给方针Isolate。

  3. 在方针Isolate中,运用ReceivePort监听来自发送方Isolate的音讯。

  4. 在发送方Isolate中,将音讯发送到方针Isolate的sendPort。

  5. 方针Isolate接纳音讯,并在需求时做出回应。

下面是一个运用SendPort和ReceivePort进行Isolate间通讯的比如:


import 'dart:isolate';
main() {
 var receivePort = new ReceivePort();
 sendPort.send(receivePort.sendPort);
 receivePort.listen((msg) {
  print('received msg: $msg');
  sendPort.send('world');
  receivePort.close();
 });

 Isolate.spawn(run, 'hello').then((isolate) {
  var sendPort = isolate;
  sendPort.send('hello');
 });
}
void run(SendPort sendPort) {
 var receivePort = new ReceivePort();
 sendPort.send(receivePort.sendPort);
 receivePort.listen((msg) {
  print('run: $msg');
  sendPort.send('hello');
  receivePort.close();
 });
}

在这个比如中,咱们需求在两个Isolate之间进行通讯。咱们在主Isolate中创立了一个ReceivePort,并将其sendPort发送给第二个Isolate。在第二个Isolate中,咱们监听了用于接纳来自主Isolate的音讯的ReceivePort,并将其sendPort发送回主Isolate。在主Isolate中,咱们接纳到第二Isolate的SendPort,并将音讯发送回第二个Isolate中。

Stream和StreamController是Dart另外两个用于Isolate之间通讯的机制。运用Stream和StreamController进行通讯的基本流程如下:

  1. 在发送方Isolate中创立一个StreamController,并将其stream发送到方针Isolate。

  2. 在方针Isolate中,运用stream监听来自发送方Isolate的音讯。

  3. 在发送方Isolate中,运用StreamController.add()办法将音讯推送到stream中。

  4. 方针Isolate接纳音讯,并在需求时做出回应。

下面是一个运用Stream和StreamController进行Isolate间通讯的比如:


import 'dart:isolate';
main() {
 var sendController = new StreamController();
 Isolate.spawn(run, sendController.stream).then((isolate) {
  sendController.add('hello');
 });
}
void run(Stream receiveStream) {
 receiveStream.listen((msg) {
  print('run: $msg');
  sendController.add('world');
  receiveStream.cancel();
 });
}

在这个比如中,咱们在主Isolate中创立了一个StreamController,并将其stream发送给第二个Isolate。在第二个Isolate中,咱们监听了用于接纳来自主Isolate的音讯的stream,并将回应再次写入stream中。在主Isolate中,咱们向stream中推送了一个“hello”音讯。

结论

在本文中,咱们介绍了Dart言语中的线程(Isolate)及其通讯机制。Isolate是Dart应用程序中履行计算的基本单位,界说Isolate的方法非常简略,而且Dart为Isolate之间的通讯供给了许多灵敏的机制,包含SendPort、ReceivePort、Stream和StreamController。假如能够合理运用这些机制,就能够规划出高效、牢靠、易于保护的Dart应用程序。