tôi sử dụng BrB để chia sẻ một nguồn dữ liệu cho quá trình lao động khác nhau trong Ruby 1.9 mà tôi ngã ba với Process # ngã ba như sau:Trace một bế tắc trong Ruby
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
Các công nhân được chia hai như sau:
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
này hoạt động khá nhiều cách hoàn hảo, nhưng sau khoảng 10 phút chạy tôi nhận được lỗi sau:
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 `'
Bây giờ lỗi này không cho tôi biết nhiều về nơi bế tắc thực sự xảy ra, nó chỉ chỉ cho tôi tham gia vào chuỗi EventMachine.
Làm cách nào để theo dõi lại thời điểm chương trình bị khóa?
Các bạn đã thử đặt 'Thread.exit' trước khi kết thúc của khối? – glebm