Dart-programming-concurrency
提供:Dev Guides
Dartプログラミング-並行性
- 同時実行*は、複数の命令シーケンスを同時に実行することです。 複数のタスクを同時に実行する必要があります。
Dartは、並行して作業を行うためのツールとして Isolates を使用しています。 dart:isolate パッケージは、シングルスレッドのDartコードを取得し、アプリケーションが利用可能なハードウェアをより活用できるようにするDartのソリューションです。
*Isolates* は、名前が示すように、実行中のコードの孤立したユニットです。 それらの間でデータを送信する唯一の方法は、クライアントとサーバーの間でメッセージを渡す方法のように、メッセージを渡すことです。 *isolate* は、プログラムがすぐにマルチコアマイクロプロセッサを利用できるようにします。
例
この概念をよりよく理解するために例を見てみましょう。
import 'dart:isolate';
void foo(var message){
print('execution from foo ... the message is :${message}');
}
void main(){
Isolate.spawn(foo,'Hello!!');
Isolate.spawn(foo,'Greetings!!');
Isolate.spawn(foo,'Welcome!!');
print('execution from main1');
print('execution from main2');
print('execution from main3');
}
ここでは、 Isolate クラスの spawn メソッドにより、コードの残りの部分と並行して関数 foo を実行できます。 *スポーン*関数は2つのパラメータを取ります-
- 生成される関数、および
- 生成された関数に渡されるオブジェクト。
生成された関数に渡すオブジェクトがない場合、NULL値を渡すことができます。
2つの関数*(fooとmain)は毎回同じ順序で実行されるとは限りません。 *foo がいつ実行され、いつ* main()*が実行されるかについての保証はありません。 出力は実行するたびに異なります。
出力1
execution from main1
execution from main2
execution from main3
execution from foo ... the message is :Hello!!
出力2
execution from main1
execution from main2
execution from main3
execution from foo ... the message is :Welcome!!
execution from foo ... the message is :Hello!!
execution from foo ... the message is :Greetings!!
出力から、Dartコードは、JavaまたはC#コードが新しいスレッドを開始できるように、実行中のコードから新しい isolate を生成できると結論付けることができます。
*Isolates* は、 *isolate* に独自のメモリがあるという点でスレッドと異なります。 *isolates* の間で変数を共有する方法はありません。 *isolates* の間で通信する唯一の方法は、メッセージの受け渡しによる方法です。
注-上記の出力は、ハードウェアおよびオペレーティングシステムの構成によって異なります。
v/s Futureを分離
複雑な計算作業を非同期で行うことは、アプリケーションの応答性を確保するために重要です。 Dart Future は非同期タスクの値を完了後に取得するためのメカニズムであり、* Dart Isolatesは並列処理を抽象化し、実用的な高レベルで実装するためのツールです。