13. Trampoling
pA
time slice tA
JavaScriptによるマルチスレッドの実現-Concurrent.Threadの裏側
http://www.infoq.com/jp/articles/js_multithread_2
14. Trampoling
pA
time slice tA
JavaScriptによるマルチスレッドの実現-Concurrent.Threadの裏側
http://www.infoq.com/jp/articles/js_multithread_2
15. Trampoling
pA
time slice tA
JavaScriptによるマルチスレッドの実現-Concurrent.Threadの裏側
http://www.infoq.com/jp/articles/js_multithread_2
16. Trampoling
setTimeout(pA)
pA
time slice tA
JavaScriptによるマルチスレッドの実現-Concurrent.Threadの裏側
http://www.infoq.com/jp/articles/js_multithread_2
17. Trampoling
setTimeout(pA)
pA
time slice tA
ここでスレッドが一時的に開放され
別のイベント処理が介入できる
JavaScriptによるマルチスレッドの実現-Concurrent.Threadの裏側
http://www.infoq.com/jp/articles/js_multithread_2
18. Trampoling
setTimeout(pA)
pA pB
time slice tA time slice tB
ここでスレッドが一時的に開放され
別のイベント処理が介入できる
JavaScriptによるマルチスレッドの実現-Concurrent.Threadの裏側
http://www.infoq.com/jp/articles/js_multithread_2
19. Trampoling
setTimeout(pA)
pA pB
time slice tA time slice tB
ここでスレッドが一時的に開放され
別のイベント処理が介入できる
JavaScriptによるマルチスレッドの実現-Concurrent.Threadの裏側
http://www.infoq.com/jp/articles/js_multithread_2
20. Trampoling
setTimeout(pA)
pA pB
time slice tA time slice tB
ここでスレッドが一時的に開放され
別のイベント処理が介入できる
JavaScriptによるマルチスレッドの実現-Concurrent.Threadの裏側
http://www.infoq.com/jp/articles/js_multithread_2
21. Trampoling
setTimeout(pA)
pA pB
time slice tA time slice tB
ここでスレッドが一時的に開放され pB が処理を終えたら pA の続き
別のイベント処理が介入できる または別のイベント処理が介入される
JavaScriptによるマルチスレッドの実現-Concurrent.Threadの裏側
http://www.infoq.com/jp/articles/js_multithread_2
22. Trampolining
now = Date.now or () -> +new Date
isFunction = (fn) -> typeof fn is‘function’
# 簡単な実装例
trampoline = (fn, ms) ->
timeLimit = now() + ms
while isFunction fn and now() < timeLimit
fn = fn() # 関数の結果を自身に代入
if isFunction fn # 処理が残ってる
setTimeout trampoline, 0, fn, ms
# node.js なら process.nextTick
return
Asynchronous programming and continuation-passing style in JavaScript
http://www.2ality.com/2012/06/continuation-passing-style.html
23. Trampolining
# 利用例
countUpWith = (iterator, limit) ->
i = 0
trampoline () ->
main = () ->
return if ++i >= limit # undefined
iterator i
main # 自身を返すのがポイント
, Math.floor 1000 / 60 # 60fps
Asynchronous programming and continuation-passing style in JavaScript
http://www.2ality.com/2012/06/continuation-passing-style.html
25. Sample
cpsFib = (callback, n) ->
pp.whilist (next, c) -> next null, c > 0
, (next, c, a, b) -> next null, c - 1, b, a + b
, (error, c, a, b) -> callback error, b
, [n, 1, 0]
# pp.whilist(test, iterator, callback, init_array)
printFib = (n) ->
cpsFib (error, result) ->
console.log error or result
# 部分適用された関数として利用できる
printFib 10 #=> 55
README かテストコード見た方が早い
https://github.com/VoQn/pp.js