Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rubyでつくるスレッド
Search
Shugo Maeda
June 30, 2018
Programming
0
1.2k
Rubyでつくるスレッド
松江Ruby会議09のLTで、callccを使ってスレッドを実装する話をしました。
Shugo Maeda
June 30, 2018
Tweet
Share
More Decks by Shugo Maeda
See All by Shugo Maeda
Refining refinements
shugo
1
310
Other Decks in Programming
See All in Programming
あなたはユーザーではない #PdENight
kajitack
4
300
AIコーディングの理想と現実 2026 | AI Coding: Expectations vs. Reality 2026
tomohisa
0
980
15年目のiOSアプリを1から作り直す技術
teakun
1
600
Go1.26 go fixをプロダクトに適用して困ったこと
kurakura0916
0
320
AI活用のコスパを最大化する方法
ochtum
0
120
AIプロダクト時代のQAエンジニアに求められること
imtnd
2
660
encoding/json/v2のUnmarshalはこう変わった:内部実装で見る設計改善
kurakura0916
0
300
手戻りゼロ? Spec Driven Developmentとは@KAG AI week
tmhirai
1
160
「やめとこ」がなくなった — 1月にZennを始めて22本書いた AI共創開発のリアル
atani14
0
350
API Platformを活用したPHPによる本格的なWeb API開発 / api-platform-book-intro
ttskch
1
120
Agent Skills Workshop - AIへの頼み方を仕組み化する
gotalab555
14
7.8k
Unity6.3 AudioUpdate
cova8bitdots
0
110
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
150
Facilitating Awesome Meetings
lara
57
6.8k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.7k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
99
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.3k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
140
The Pragmatic Product Professional
lauravandoore
37
7.2k
The Spectacular Lies of Maps
axbom
PRO
1
580
How STYLIGHT went responsive
nonsquared
100
6k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Transcript
Rubyでつくる スレッド Shugo Maeda NaCl 2018-06-30
やりたいこと MinThread.start do 20.times do |i| puts "Thread#1: #{i}" sleep(0.1)
end end MinThread.start do 20.times do |i| puts "Thread#2: #{i}" sleep(0.1) end end
継続(Continuation) 次に実行される計算を表す グローバルgoto オブジェクトの状態は戻らない Ruby 1.8のスレッドの実装を利用 [ruby-dev:4083] 継続でスレッドをつくれるのでは?
わかる人にはわかる説明(1) Ruby 1.8のスレッドはsetjmp()/ longjmp()で切り替える スタックは自前で保存して書き戻す 継続も同じ仕組み
わかる人にはわかる説明(2) スレッド 並行宇宙 継続 世界線
継続の例 require "continuation" callcc {|c| $cont = c} print "Hello,
World!\n" $cont.call
実装
スレッドの作成 module MinThread QUEUE = [] def self.start(&block) QUEUE.push(block) end
スレッドの実行 def self.resume proc = QUEUE.shift if proc proc.call end
end at_exit do MinThread.resume end
スレッドの切替 def self.pass callcc do |c| QUEUE.push(c) resume end end
動いた! MinThread.start do 20.times do |i| puts "Thread#1: #{i}" sleep(0.1)
MinThread.pass end end MinThread.start do 20.times do |i| puts "Thread#2: #{i}" sleep(0.1) MinThread.pass end end
でも何か違う MinThread.start do 20.times do |i| puts "Thread#1: #{i}" sleep(0.1)
MinThread.pass # これが必要 end end MinThread.start do 20.times do |i| puts "Thread#2: #{i}" sleep(0.1) MinThread.pass # これが必要 end end
勝手にスレッドを切り替えたい
TracePoint Ruby実行中のイベントをフック フックで切り替えればいいのでは?
実装 at_exit do MinThread.set_next_switch_time TracePoint.trace(:line) do |tp| MinThread.schedule # 一定時間毎にThread.pass
end MinThread.resume end
1回しか切り替わらない!
理由 フックの中ではTracePointが無効 化される フック中で継続を呼ぶと無効化され たまま
じゃあモンキーパッチで at_exit do MinThread.set_next_switch_time [Integer, String, Array, Hash, IO, File].each
do |mod| mod.prepend Module.new { mod.instance_methods(false).each do |method| define_method(method) do |*args, &block| MinThread.schedule super(*args, &block) end end } end MinThread.resume end
デモ
課題 IOなどでブロックすると全部止まる IO#readなどをノンブロッキングIOで再実 装すればいい
まとめ スレッドはつくれる