コルーチンの実装について
TRANSCRIPT
@miyakawa_taku
JJUG幹事
SI屋で賃労働
オレオレJVM言語Kinkを作っています
https://bitbucket.org/kink/kink
尾上部屋の里山関のファンです
自己紹介1/12
Kinkとは!
こんなの↓
プロトタイプベースのオブジェクト指向
言語
JVM上で動く言語処理系だ!
仕様策定者: 宮川 拓
実装者: 宮川 拓
ユーザ: 宮川 拓
2/12
Clojureのcoroutine-based core-async
についての質問が分からん!
と言われたので説明します
3/12
コルーチンの実装について
2014-04-18 渋谷JVM LT
宮川 拓
4/12
参考文献
Resumable Funtions v2
http://www.open-
std.org/jtc1/sc22/wg21/docs/papers/20
14/n4134.pdf
C++の仕様化プロセスの文書
コルーチン周りの話題を網羅
特に読みやすくはない
5/12
コルーチン?
カーネルのスケジューラの外で
実現するスレッド
Goのgoroutine,
Erlangの「プロセス」など
100万とかの数が作れる
6/12
Q1
コルーチンの中でメソッドを呼び出して、
その先でチャネルの読み書きをしたとき、
コンテキストスイッチはされる?
7/12
コンテキストスイッチ
coroutine {
do_x()
your_chan.send(v1)
do_y()
v2 = my_chan.recv()
do_z()
}
8/12
コンテキストスイッチ
implement_coroutine(frame) {
switch (frame.ip) {
0: frame.ip=1, do_x()
return your_chan.send(v1)
1: frame.ip=2, do_y()
return my_chan.recv()
2: v2 = frame.last_result
do_z()
return
}
}
←みたいに変換
されるはず
9/12
コンテキストスイッチ
coroutine {
do_something()
}
function do_something() {
your_chan.send(v)
}
←こいつは変換
できるけど
←こいつは変換
できない!
10/12
やりよう次第
例外を駆使すれば呼び出し先での
コンテキストスイッチも可能
例: Quasar
http://www.slideshare.net/miyakawatak
u/quasar-actor-model-and-light-weight-
threads-on-java
11/12
Q2
コルーチンの中でのIOはどうしよう?
12/12
IOはブロックするのだ!
普通のIOはカーネルでブロックします
ブロックすると、独自のコンテキストス
イッチの仕組みは動きません
なので、コルーチンと組み合わせられる
IOライブラリがあると便利です
QuasarやN4134にはある
13/12