📜  Dart – 并发

📅  最后修改于: 2021-09-23 06:25:02             🧑  作者: Mango

简单来说,并发意味着应用程序一次在多个任务中取得进展。在正常的应用程序或程序中,每一行代码都按顺序执行,一个接一个。但是使用并发的程序可以同时运行两个函数。如果一个耗时的任务与其他任务同时执行,可以提高程序的吞吐量和交互性。

注意:并发程序可能会也可能不会并行执行,这取决于您的机器(单核/多核)

如果您在单核系统中尝试并发,您的 CPU 只会使用调度算法并在任务之间切换,因此实际上单核 CPU 中的任务会同时进行,但不会有两个任务同时执行。

Dart的并发:

在Dart,我们可以通过使用 Isolates 来实现并发。顾名思义,隔离是隔离运行的代码块。如果您熟悉线程,您可能会认为线程类似于隔离。尽管它们提供相同的功能,但它们之间存在内部差异。在一个进程中,所有线程共享一个公共内存,另一方面,isolates 是独立的 worker,它们不共享内存,而是通过在通道上传递消息来互连。

Dart提供了dart:isolate 包来在我们的程序中使用隔离。

句法:

Isolate.spawn(function_name,'message_to_pass'); 

隔离有助于程序利用开箱即用的多核微处理器。没有办法在隔离之间共享变量——隔离之间通信的唯一方法是通过消息传递。

示例 1:

Dart
import 'dart:isolate';  
  
void function_name(var message){ 
   print('${message} From Isolate'); 
}  
void main(){ 
   Isolate.spawn(function_name,'Geeks!!'); 
   Isolate.spawn(function_name,'For!!'); 
   Isolate.spawn(function_name,'Geeks!!'); 
     
   print('Normal Print 1'); 
   print('Normal Print 2'); 
   print('Normal Print 3'); 
}


Dart
import 'dart:isolate';
  
void isofunction(var msg) {
  for (int i = 0; i < 7; i++) {
    print(msg + "$i");
  }
}
  
void main() async {
  Isolate.spawn(isofunction, "Isolate Function ");
  
  print("Hello Main 1");
  print("Hello Main 2");
  print("Hello Main 3");
}


Dart
import 'dart:isolate';
  
Future isofunction(var msg) async {
  for (int i = 0; i < 7; i++) {
    print(msg + "$i");
  }
}
  
void main() async {
  await Isolate.spawn(isofunction, "Isolate Function "); // Isolate Function
  
  print("Hello Main 1");
  print("Hello Main 2");
  print("Hello Main 3");
}


输出:

Normal Print 1
Normal Print 2
Normal Print 3
For!! From Isolate
Geeks!! From Isolate
Geeks!! From Isolate

您的输出可能会有所不同。

有时,如果您有一个非常复杂的函数在 Isolate 上运行,那么该函数可能无法完全执行。

示例 2:

Dart

import 'dart:isolate';
  
void isofunction(var msg) {
  for (int i = 0; i < 7; i++) {
    print(msg + "$i");
  }
}
  
void main() async {
  Isolate.spawn(isofunction, "Isolate Function ");
  
  print("Hello Main 1");
  print("Hello Main 2");
  print("Hello Main 3");
}

输出:

Hello Main 1
Hello Main 2
Hello Main 3
Isolate Function 0
Isolate Function 1
Isolate Function 2
Isolate Function 3

在这里,我有一个在 Isolate 上运行的 for 循环,但我的 for 循环只运行了 4 次迭代,这是因为当我的 for 循环进行迭代时,主函数到达了它的最后执行行。所以程序杀死了正在运行的隔离函数。

注意:您的输出可能会有所不同。

如果您希望隔离函数完全运行,则可以使用-异步编程:期货、异步、等待

示例 3:

Dart

import 'dart:isolate';
  
Future isofunction(var msg) async {
  for (int i = 0; i < 7; i++) {
    print(msg + "$i");
  }
}
  
void main() async {
  await Isolate.spawn(isofunction, "Isolate Function "); // Isolate Function
  
  print("Hello Main 1");
  print("Hello Main 2");
  print("Hello Main 3");
}

输出:

Hello Main 1
Hello Main 2
Hello Main 3
Isolate Function 0
Isolate Function 1
Isolate Function 2
Isolate Function 3
Isolate Function 4
Isolate Function 5
Isolate Function 6

如果您想了解更多关于期货Dart:在Dart异步编程