EventMachine - 阻止主线程?

时间:2013-09-04 13:05:24

标签: ruby multithreading eventmachine

我在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添加“work”时,将不再有状态输出:

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

0 个答案:

没有答案