SlideShare a Scribd company logo
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

PPT
Javascriptで無限ループを実現する5つの方法
PDF
第6回鹿児島node.jsの会資料_内村
PPT
Lockfree Queue
PDF
Open vzでdr hbstudy
PDF
mrubyのfiberを試してみた
PDF
実はこんなこともできる Fireworksの裏技
PDF
minami.rb最初で最後のLT大会「Wakayama.rbの紹介」
PDF
Python vs ruby
Javascriptで無限ループを実現する5つの方法
第6回鹿児島node.jsの会資料_内村
Lockfree Queue
Open vzでdr hbstudy
mrubyのfiberを試してみた
実はこんなこともできる Fireworksの裏技
minami.rb最初で最後のLT大会「Wakayama.rbの紹介」
Python vs ruby

What's hot (20)

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

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

PDF
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
PDF
Em synchrony について
PDF
18166746-NeverBlock-RubyKaigi2009
PDF
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
PDF
Ruby&Active Support for expert 3
PDF
Ruby 2.5
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
Em synchrony について
18166746-NeverBlock-RubyKaigi2009
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Ruby&Active Support for expert 3
Ruby 2.5
Ad

Rubyでつくるスレッド