Dart Isolates

2024 年 8 月 29 日 | 4 分钟阅读

Dart 允许我们进行异步编程,这使得我们的程序在不被阻塞的情况下运行。 异步编程用于实现并发。 Dart isolate 是线程的一个版本。 但是,关于“线程”或“Isolates”的常见实现,存在关键差异。 Isolates 的工作方式与 Thread 不同。 Isolates 是独立的 worker,它们不共享内存,而是通过在通道上传递消息来互连。 由于 Isolates 通过传递消息来完成其任务,因此它需要一种序列化消息的方式。

Isolates 之间的通信通过消息传递完成,作为客户端和服务器。 它有助于程序开箱即用地利用多核微处理器。

Dart 提供了 dart:isolate 包,以将 isolate 应用于我们的程序。 它提供了解决方案,以采用单线程 Dart 代码,并允许应用程序更好地利用可用的硬件。

创建和启动一个 Isolate

Dart 提供了 spawn() 方法来创建一个 isolate。 它必须使用带有单个参数的“入口点”来声明。 此参数显示一个端口,isolate 使用该端口来引用回通知消息。

让我们理解以下示例 -

示例 -

输出

execution from main1
execution from main2
execution from main3
execution from sayhii ... the message is :Whats up!!
execution from sayhii ... the message is :Hello!!

输出 2

execution from main1
execution from main2
execution from main3
execution from sayhii ... the message is :Hello!!
execution from sayhii ... the message is :Welcome!!

说明

在上面的程序中,isolate 类的 spawn 方法并行执行一个函数 sayhii,剩余的代码也是如此。 它接受两个参数。

  • 我们想要生成的函数和将传递给生成函数的字符串。

我们有两个函数 sayhii() 和 main() 函数,它们每次运行的顺序可能不一样。 如果你运行上面的程序,那么输出每次都会有所不同,正如我们在第二个输出中看到的那样。

注意 - 如果在生成的函数中没有要传递的对象,我们也可以传递 NULL 值。

让我们理解另一个例子 -

示例 - 2

说明

在上面的代码中,我们创建了一个异步方法 start(),它创建一个端口并生成一个 isolate。 我们将 start 方法标记为 async,因为我们可以等待来自 isolate 生成的响应,并存储对新 isolate 的引用。 当我们想终止正在运行的 isolate 时,这至关重要。 我们在 spawn() 方法中传递了两个参数,第一个参数是 runTimer 方法,这是一个用于执行 runTimer() 的回调函数,第二个参数是 sendPort,它是一个回调函数,它将用于将消息发送回调用者。 start() 方法开始监听来自 isolate 的 receiverPort 的消息。 一旦它收到消息,它就会将其打印为控制台输出。

runTimer() 方法开始一个计时器,该计时器每秒触发一次以更新计数器。 它通过端口发送通知消息,该端口是在 isolate 被生成时收到的。

停止一个 Isolate

dart: isolates 包提供了 kill() 方法,该方法用于停止正在运行的 isolate。

让我们理解下面的例子。

示例 -

说明

在上面的例子中,我们声明了一个 stop() 方法,它将销毁正在运行的 isolate,并将其引用设置为 null。 我们定义了 isolate 的优先级:立即,它将立即终止 isolate。

完整的程序

输出

Stating Isolate 
Hit enter key to quit 
Sending: notification 1 - Receiving: notification 1, Sending: notification 2 - Receiving: notification 2,
Stopping Isolate

下一个主题Dart 异步