utilizo BrB compartir un origen de datos para diversos procesos de trabajo en Ruby 1.9 que el tenedor con el proceso # tenedor como la siguiente:Traza un estancamiento en 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
Los trabajadores son bifurcadas de la siguiente manera:
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
Esto funciona casi a la perfección, pero después de unos 10 minutos de carrera me sale el siguiente error:
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 `'
Ahora bien, este error no me dice mucho sobre dónde está realmente pasando el punto muerto, solo me señala la unión en el subproceso EventMachine.
¿Cómo puedo rastrear en qué punto se bloquea el programa?
Ha intentado poner 'Thread.exit' antes del final de la manzana? – glebm