coroutine
coroutineは、callee側で特定行で中断(コンテキストを保持)して、callerにprogrammingの実行権?を戻す 利点は、
pythonの場合?は、coroutine実行側のローカル変数を保持して、再開できる。
まだ、理解してない...
await futureでは制御を戻して、スレッドは別の仕事ができる。結果は完了して受け取る?
await coroutineは制御をそちらのまま? 別のcoroutineが中に居る?ので、それを待つ?
結局、await futureの形にしないと、event_loopに戻らない?
await coroutineは、sequentialに書けるという利点は残ってる?
kotlinの場合は、非同期関数を同期的に書ける。値を返せる? kotlinの場合は...
あと、構造化された coroutine flowで、context, scopeの共有ができる。
考え方
サブルーチンではリターンのたびに局所変数が初期化されてしまうことで、将棋の持ち駒のような個々のプレーヤの実行時のコンテクストは別のデータとしてサブルーチンの外
マルチプロセスと本質は同じであり
初期化されたコルーチンは、データとしてのコンテクストとそれに対する操作として手続きを閉じ込めているからオブジェクト指向におけるオブジェクトとして考えても良いだろう。
subroutineと coroutineを並べて考えることができてなかった。。これを読むまで。
corutineの初期化とは?
pythonだと generator関数を実行して変数に代入した場合、
この変数はオブジェクト(send()で値をpasできるし、データを受け取れる)
なんとなく、tmuxをdetachして違う事を始めるイメージ。coroutine
ioバウンドな処理があるときに、非同期処理にして、コーヒーを入れに行くイメージでもあるかも。
言語別
pythonの async/await future
nodejs の promise, async/await
ある関数(メソッド?)の実行時に、無名関数やblock(関数オブジェクトだったかな..あやしい)を関数の引数としてとる。実行する関数の中にyieldがあれば、そこで、その無名関数が実行される。無名関数は引数をとれて、実行すう関数の呼び出し時(yield)に渡せる。
そのうち、aws lambda とか Google Cloud Functionsとかで、1つのfunctionでcoroutineはあるだろうけど、複数のfunctionsでcoroutineとかになると、、、別におもしろくはないな。。