Kotlin のコルーチン原理

Dispatchers.Main 
Dispatchers.IO 
Dispatchers.Default 
Dispatchers.Unconfined

IO と Default は共通のスレッド プールを使用します。違いは、2 つのコア スレッドの数と最大スレッド数の構成が異なることです。

デフォルトは CPU を集中的に使用し、コア スレッドの数は可能な限り CPU コアの数と同じになります。

IO は IO 集中型であり、コア スレッドの数は可能な限りタスクの数と等しく、スレッドの最大数は CPU コアの数と 64 の両方の最大値と等しくなります。

原則は次のとおりです。

オンにする:

コルーチンが有効になると、コンパイラはコルーチンのスコープ (コード ブロック) を次の内容にコンパイルします。 SuspendLambda クラスは、現在のコルーチンが一時停止されるポイントの状態を定義します。各一時停止ポイントは異なる状態に対応します。SuspendLambda このクラスは現在の実行状態を保存します。このように、コルーチン内のコード ブロックは多くのセグメントに分割され、各セグメントの間に状態ポイントが存在します。通常の状況では、コルーチンは各コードを順番に実行します。そして、各コルーチンは Continuation に対応しており、この DispatchedContinuation は本質的に Runnable を実装するインスタンスです。最後に、DispatchedContinuation.resumeWith() は、この DispatchedContinuation を対応するスレッドに入れて実行します。IO と Default はスレッド プールに配置され、Main はメイン スレッドに対応する Handler で実行されます。

下がる:

withContext() などの API がコルーチン内で呼び出されると、新しいコルーチンは現在のコルーチンを一時停止し、

SuspendLambda での一時停止が放棄され、状態が coroutine_suspended に変更されます。コルーチンの状態が coroutine_suspended に変更されると、実行プロセスが戻され、以降のコードは実行されなくなります。

回復:

親コルーチンへの参照を保持する子コルーチンが開始されました。子コルーチンの実行が終了すると、親コルーチンの SuspendLambda の invokeSuspend() を呼び出して状態を実行状態に変更し、親コルーチンは、子コルーチンに対応するコード セグメントの位置に従って残りのコードを実行します。州。

ディスパッチャー.Unconfined

スレッドが定義されていない場合、コルーチンが一時停止されている場合、コルーチンのスレッド上で実行されます。

原則として、DispatchedContinuation.resume() メソッドは、それを中断するコルーチンが実行された後に呼び出されます。その中には、割り当てられたスレッドが何であるかを判断するためのロジックがあります。未定義の場合は、そのメソッドの EventLoop が取り出されます。現在のコルーチンに対応するスレッドを取得し、ThreadLocal を渡して取得します。次に、Unconfined タスクをこの EventLoop に入れて実行します。これを行うと、スレッドが一時停止され、コルーチンに対応するスレッドで再開されます。

おすすめ

転載: blog.csdn.net/Leo_Liang_jie/article/details/122951427