0

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
4

0 に答える 0