有没有办法让Ruby进程/线程暂停,直到某些外部进程的信号(或其他进程间通信机制)恢复为止?我尝试了以下内容,但线程似乎没有醒来:
this_thread = Thread.current
Thread.new do
Signal.trap("INT") do
puts "\nWaking up!"
this_thread.run
end
sleep
end
puts "Going to sleep..."
Thread.stop
puts "Now awake! =)"
示例运行:
$ ruby wake_on_signal.rb Going to sleep... ^C Waking up! ^C Waking up! ^C Waking up!
我也尝试过以下方法,它可以运行,但依赖于不断检查某些变量的值,如果可能的话我宁愿避免这样做:
signal_received = false
Signal.trap("INT") do
puts "\nWaking up!"
signal_received = true
end
puts "Going to sleep..."
sleep 0.5 until signal_received
puts "Now awake! =)"
示例运行:
$ ruby sleep_until_signal.rb Going to sleep... ^C Waking up! Now awake! =)
答案 0 :(得分:1)
这已经晚了三年,但对未来的读者可能会有所帮助:
puts "kill -#{Signal.list["USR1"]} #{Process.pid}"
thr = Thread.new do
this_thread = Thread.current
Signal.trap("USR1") do
puts "\nWaking up!"
this_thread.kill
end
sleep
end
puts "Going to sleep..."
thr.join
puts "Now awake! =)"
这将暂停主线程并等待USR1信号。它打印出可用于唤醒线程的命令。在我的系统上,打印
$ ruby signal_handler.rb
kill -30 66771
Going to sleep...
Waking up!
Now awake! =)
答案 1 :(得分:0)
您可以使用at_exit
执行此操作:
at_exit do
puts "Now awake! =)"
end
Signal.trap("INT") do
puts "\nWaking up!"
exit
end
puts "Going to sleep..."
sleep
示例运行:
$ ruby wake_on_signal.rb Going to sleep... ^C Waking up! Now awake! =)