SlideShare a Scribd company logo
1 of 21
Download to read offline
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で再実
装すればいい
まとめ
スレッドはつくれる

More Related Content

What's hot

論理回路簡略化の極意
論理回路簡略化の極意論理回路簡略化の極意
論理回路簡略化の極意yangniao
 
ループその3
ループその3ループその3
ループその3TENTO_slide
 
量子コンピュータと量子暗号 Quantum Computer & Quantum Cryptography
量子コンピュータと量子暗号 Quantum Computer & Quantum Cryptography量子コンピュータと量子暗号 Quantum Computer & Quantum Cryptography
量子コンピュータと量子暗号 Quantum Computer & Quantum CryptographyKite Koga
 
Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話Masaya Yashiro
 
RPCノード構築方法【Litecoin】
RPCノード構築方法【Litecoin】RPCノード構築方法【Litecoin】
RPCノード構築方法【Litecoin】qaz_id
 
JMeter小話
JMeter小話JMeter小話
JMeter小話eiryu
 
Maglica - A Simple Internal Cloud Tool at #techkayac
Maglica - A Simple Internal Cloud Tool at #techkayacMaglica - A Simple Internal Cloud Tool at #techkayac
Maglica - A Simple Internal Cloud Tool at #techkayacGosuke Miyashita
 
Vim の話
Vim の話Vim の話
Vim の話cohama
 
Goで学ぶDApp(aizu.go#2)
Goで学ぶDApp(aizu.go#2)Goで学ぶDApp(aizu.go#2)
Goで学ぶDApp(aizu.go#2)Koki Natsume
 
JRuby on Rails on JBoss
JRuby on Rails on JBossJRuby on Rails on JBoss
JRuby on Rails on JBossbose999
 
Rubyで実はwritev(2) が使われているはなし
Rubyで実はwritev(2) が使われているはなしRubyで実はwritev(2) が使われているはなし
Rubyで実はwritev(2) が使われているはなしMasaki Matsushita
 
Rustを勉強してみた!
Rustを勉強してみた!Rustを勉強してみた!
Rustを勉強してみた!ssmylh
 
vimの話20150111
vimの話20150111vimの話20150111
vimの話20150111yassu0320
 

What's hot (20)

LSTM
LSTMLSTM
LSTM
 
論理回路簡略化の極意
論理回路簡略化の極意論理回路簡略化の極意
論理回路簡略化の極意
 
ループその3
ループその3ループその3
ループその3
 
ぎっとの「ぎ」
ぎっとの「ぎ」ぎっとの「ぎ」
ぎっとの「ぎ」
 
量子コンピュータと量子暗号 Quantum Computer & Quantum Cryptography
量子コンピュータと量子暗号 Quantum Computer & Quantum Cryptography量子コンピュータと量子暗号 Quantum Computer & Quantum Cryptography
量子コンピュータと量子暗号 Quantum Computer & Quantum Cryptography
 
メモリのおはなし
メモリのおはなしメモリのおはなし
メモリのおはなし
 
Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話
 
RPCノード構築方法【Litecoin】
RPCノード構築方法【Litecoin】RPCノード構築方法【Litecoin】
RPCノード構築方法【Litecoin】
 
JMeter小話
JMeter小話JMeter小話
JMeter小話
 
Maglica - A Simple Internal Cloud Tool at #techkayac
Maglica - A Simple Internal Cloud Tool at #techkayacMaglica - A Simple Internal Cloud Tool at #techkayac
Maglica - A Simple Internal Cloud Tool at #techkayac
 
Vim の話
Vim の話Vim の話
Vim の話
 
Goで学ぶDApp(aizu.go#2)
Goで学ぶDApp(aizu.go#2)Goで学ぶDApp(aizu.go#2)
Goで学ぶDApp(aizu.go#2)
 
詳解! Decimal
詳解! Decimal詳解! Decimal
詳解! Decimal
 
Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70
 
JRuby on Rails on JBoss
JRuby on Rails on JBossJRuby on Rails on JBoss
JRuby on Rails on JBoss
 
MmapScanner
MmapScannerMmapScanner
MmapScanner
 
Rubyで実はwritev(2) が使われているはなし
Rubyで実はwritev(2) が使われているはなしRubyで実はwritev(2) が使われているはなし
Rubyで実はwritev(2) が使われているはなし
 
Rustを勉強してみた!
Rustを勉強してみた!Rustを勉強してみた!
Rustを勉強してみた!
 
Webページで学ぶJavaScript2013 第1回
Webページで学ぶJavaScript2013 第1回Webページで学ぶJavaScript2013 第1回
Webページで学ぶJavaScript2013 第1回
 
vimの話20150111
vimの話20150111vimの話20150111
vimの話20150111
 

Similar to Rubyでつくるスレッド

18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi200918166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009Muhammad Ali
 
Java8から17へ
Java8から17へJava8から17へ
Java8から17へonozaty
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッドKohsuke Yuasa
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会Koichi Sakata
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Yuichi Sakuraba
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 sandai
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Koji SHIMADA
 
並列化による高速化
並列化による高速化 並列化による高速化
並列化による高速化 sakura-mike
 
スレッドダンプの読み方
スレッドダンプの読み方スレッドダンプの読み方
スレッドダンプの読み方Funato Takashi
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGUehara Junji
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep LearningSatoshi imai
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』H2O Space. Co., Ltd.
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門Tomoya Kawanishi
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Uehara Junji
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!bitter_fox
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireAkio Katayama
 

Similar to Rubyでつくるスレッド (20)

18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi200918166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009
 
Java8から17へ
Java8から17へJava8から17へ
Java8から17へ
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
 
Em synchrony について
Em synchrony についてEm synchrony について
Em synchrony について
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4
 
並列化による高速化
並列化による高速化 並列化による高速化
並列化による高速化
 
スレッドダンプの読み方
スレッドダンプの読み方スレッドダンプの読み方
スレッドダンプの読み方
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
Bp study39 nodejs
Bp study39 nodejsBp study39 nodejs
Bp study39 nodejs
 

Rubyでつくるスレッド