遠藤侑介 @mametter
クックパッドで働くフルタイム Ruby コミッタ
コルーチンは Ruby コミッタになったきっかけ(の 1 つ)
ささだ 2007/05/28
Continuation のついでに Fiber を入れました。
(略)
というわけで、皆様にいくつかご相談です。おもに、名前と機能の話です。広くご意見を頂けると幸いです。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/30827
遠藤 2007/08/22
Fiber や Coroutine という言葉には、ちゃんとした定義もコンセンサスもないようなので、はっきりいって言ったもん勝ちです。
(略)
短くてかっこいいのを選べばいいと思います。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/31596
元祖のコルーチン、transfer
で実行を渡す
A = Fiber.new {
# 2. A に実行が渡された → B に実行を渡す
B.transfer()
# 4. A に(再度)実行が渡された → 実行終了
}
B = Fiber.new {
# 3. B に実行が渡された → A に実行を返す
A.transfer()
# ここには到達しない
}
# 1. コルーチン A に実行を渡す
A.transfer()
単純だけど使いにくいので使われていない
resume で起動(再開)、yield で中断
A = Fiber.new {
# 2. A が起動された → 中断して呼び出し元に処理を返す
Fiber.yield()
# 4. A はここから再開する → 終了して呼び出し元に処理を返す
}
# 1. コルーチン A を起動する
A.resume()
# 3. A が中断して帰ってきた → A を再開する
A.resume()
# 5. A が終了して帰ってきた → 実行終了
2000年代まではコルーチンと言えばコレだった
無限列の実装に使える
async/await: 非同期処理を同期風に書く記法
async function asyncABC() {
await sleep(1000);
print("foo");
await sleep(1000);
print("bar");
}
await sleep(1000);
print("baz");
ここでの「コルーチン」=async function
伝統的コルーチンとは完全に別物!
1990年代:関数は即時リターンする文化
2000年代:JavaScript アプリの複雑化
ES2015:非対称コルーチンと Promise の導入
ES2017:async/await の導入
すでに別の意味で定着しつつある模様
みんなが愛した伝統的「コルーチン」は死んだ