我在 Ruby Eventmachine 中执行以下操作,每 5 秒给我一个状态输出:
def status_output
puts Time.now.to_s
EM::Timer.new(5) { status_output }
end
EM::run do
status_output
end
它工作正常,但是当我向 eventmachine 添加“工作”时,将不再有状态输出:
EM::run do
status_output
10_000.times do
EM::defer(proc {
# ... processing data...
})
end
end
这是否表明数据处理正在阻塞主线程?我正在使用 Ruby MRI 1.8.7(我知道,我知道),所以我猜一个块会影响所有线程(所以我想这可以解释吗?)
顺便说一句,我检查了数据处理代码,但没有什么明显的可能阻塞的地方。什么是常见的(不那么明显的)可能会阻塞的东西?
编辑:
正如 mudasobwa 所指出的,我正在添加一个更好的例子:(但我仍然不确定这是否与我实际运行的同构)
require "rubygems"
require "eventmachine"
def status_output
puts Time.now.to_s
EM::Timer.new(1) { status_output }
end
def process_data
500_000.times do
rand(24 ** 24).to_s(36)
end
puts "#{Time.now.to_s}: finished!"
end
EM::run do
status_output
1000.times {
EM::defer(proc {
process_data
})
}
end
# Output:
# Wed Sep 04 18:08:58 +0400 2013
# Wed Sep 04 18:09:03 +0400 2013 # Gap here
# Wed Sep 04 18:09:04 +0400 2013
# Wed Sep 04 18:09:05 +0400 2013
# Wed Sep 04 18:09:06 +0400 2013