Ruby等待来自外部进程的信号
有没有办法让Ruby进程/线程暂停自己,直到它被来自某个外部进程的信号(或其他进程间通信机制)恢复?我尝试了以下方法,但线程似乎没有被唤醒:Ruby等待来自外部进程的信号,ruby,Ruby,有没有办法让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 aw
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!
$ ruby sleep_until_signal.rb
Going to sleep...
^C
Waking up!
Now awake! =)
$ ruby wake_on_signal.rb
Going to sleep...
^C
Waking up!
Now awake! =)
运行示例:
$ ruby wake_on_signal.rb
Going to sleep...
^C
Waking up!
^C
Waking up!
^C
Waking up!
$ ruby sleep_until_signal.rb
Going to sleep...
^C
Waking up!
Now awake! =)
$ ruby wake_on_signal.rb
Going to sleep...
^C
Waking up!
Now awake! =)
$ruby sleep\u until\u signal.rb
要睡觉了。。。
^C
醒醒!
现在醒来!=)
您可以使用退出时的
来执行此操作:
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!
^C
Waking up!
^C
Waking up!
$ ruby sleep_until_signal.rb
Going to sleep...
^C
Waking up!
Now awake! =)
$ ruby wake_on_signal.rb
Going to sleep...
^C
Waking up!
Now awake! =)
$ruby wake_on_signal.rb
要睡觉了。。。
^C
醒醒!
现在醒来!=)
这大约晚了三年,但可能对未来的读者有所帮助:
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! =)
哈哈。很好的尝试,但我真的需要程序在唤醒后继续运行P在收到信号后,我的真实程序需要做的事情远不止打印“Now awake!=)”然后退出。你可以把所有这些都放到一个方法中,然后在退出时调用它但是我明白你的意思了——能够停下来并重新开始几次会很好。