я использую BrB разделять источник данных для различных рабочих процессов в Ruby 1.9, что я вилку с процессом # вилкой, как следующее:Трассировка затора в Руби
Thread.abort_on_exception = true
fork do
puts "Initializing data source process... (PID: #{Process.pid})"
data = DataSource.new(files)
BrB::Service.start_service(:object => data, :verbose => false, :host => host, :port => port)
EM.reactor_thread.join
end
Рабочие раздвоенным следующим образом:
8.times do |t|
fork do
data = BrB::Tunnel.create(nil, "brb://#{host}:#{port}", :verbose => false)
puts "Launching #{threads_num} worker threads... (PID: #{Process.pid})"
threads = []
threads_num.times { |i|
threads << Thread.new {
while true
begin
worker = Worker.new(data, config)
rescue OutOfTargetsError
break
rescue Exception => e
puts "An unexpected exception was caught: #{e.class} => #{e}"
sleep 5
end
end
}
}
threads.each { |t| t.join }
data.stop_service
EM.stop
end
end
Это работает в значительной степени прекрасно, но примерно через 10 минут бега я получаю следующее сообщение об ошибке:
bootstrap.rb:47:in `join': deadlock detected (fatal) from bootstrap.rb:47:in `block in ' from bootstrap.rb:39:in `fork' from bootstrap.rb:39:in `'
Теперь эта ошибка не говорит мне о том, где тупик на самом деле происходит, он указывает только на соединение в потоке EventMachine.
Как проследить, в какой момент программа блокируется?
Вы пробовали положить 'Thread.exit' до конца блока? – glebm