3. • Обработка запроса в многопоточном сервере (Puma)
может быть очень долгим
• Как реализована многопоточность в MRI Ruby
• Как работает планировщик и приоритетность
4. • Что внутри EventMachine
• Когда вам могут понадобиться файберы
• Дальнейшее развитие многопоточности в Ruby
10. MRI
model 1: Userlevel Thread
Same as traditional ruby thread.
model 2: Native Thread with Global VM lock
Using pthread and Ruby threads run concurrent.
model 3: Native Thread with fine grain lock
Using pthread and Ruby threads run concurrent or parallel.
YARV Thread Design
11. MRI
model 1: Userlevel Thread
Same as traditional ruby thread.
model 2: Native Thread with Global VM lock
Using pthread and Ruby threads run concurrent.
model 3: Native Thread with fine grain lock
Using pthread and Ruby threads run concurrent or parallel.
YARV Thread Design
12. MRI
model 1: Userlevel Thread
Same as traditional ruby thread.
model 2: Native Thread with Global VM lock
Using pthread and Ruby threads run concurrent.
model 3: Native Thread with fine grain lock
Using pthread and Ruby threads run concurrent or parallel.
YARV Thread Design
15. MRI
model 1: Userlevel Thread
Same as traditional ruby thread.
model 2: Native Thread with Global VM lock
Using pthread and Ruby threads run concurrent.
model 3: Native Thread with fine grain lock
Using pthread and Ruby threads run concurrent or parallel.
YARV Thread Design
58. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
59. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
60. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
61. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
62. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
63. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
64. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
65. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
66. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
70. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
71. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
72. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
73. EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
p 1
res = EventMachine::HttpRequest.new("https://www.ruby-lang.org/").aget
res.callback { p 4; current_fiber.resume(5) }
p 2
puts Fiber.yield
p 6
end
p 0
fiber.resume
p 3
end
76. enumerator =
Fiber.new do
val = 0
loop do
val += 1
Fiber.yield(val)
end
end
enumerator.resume # => 1
enumerator.resume # => 2
enumerator.resume # => 3