POE
调用POE::Kernel->stop()
导致立即关闭。在关闭之前,如何请求正常关闭,等待yield,post,调用FIFO为空?
答案 0 :(得分:1)
我不认为这是完全清楚的。
收益率,邮政等将清空,最终您的脚本将关闭。 “优雅关闭”是一种概念,例如,当您使用套接字驱动的应用程序时,您希望确保在“关闭/关闭套接字”之前通过套接字完成所有活动活动。
所以也许解决方案不是POE :: Kernel中的东西,而是你自己的代码?
答案 1 :(得分:1)
如果您创建一个内联状态,删除别名和任何未完成的警报,您的会话应该优雅地结束。它只会在等待事件返回或被另一个会话使用时才会保留。
答案 2 :(得分:1)
什么是建议的方法来结束事件循环等待某些任务而忽略其他任务?
首先,等待你想完成的任务。
完成后,您可以选择在剩余任务完成之前结束事件循环。
一个是致电POE::Kernel->stop()
。这将停止事件循环,并且将返回主POE::Kernel->run()
调用。通常在那之后无事可做,但有些程序会在那里进行一次性的最终确定。
另一个是杀死这个过程。 kill(TERM => $$)
。使用将导致操作系统终止进程的信号。但这非常严厉。
您可以通过POE::Kernel->sig()
调用注册SIGTERM处理程序来缓解这种打击。这将让你在SIGTERM到达时运行一些代码,但它再一次把你所有程序的关闭负担。
其他苛刻的选项包括exit()
,它至少允许运行DESTROY
和END
块的对象。如果你不想,他们总是POSIX::_exit()
。当然还有die()
。
如果您不想涉及操作系统,可以使用POE::Kernel->signal(TERM => $kernel)
调用来注入假的SIGTERM。这实际上是当真正的SIGTERM到达时POE :: Kernel在幕后做的事情。
您还可以使用POE::Kernel->signal()
向各个会话发送信号。作为模拟信号的一个好处是,它不一定是整个程序的范围。
从大多数到最不推荐的顺序:
POE::Kernel->signal()
杀死特定的顽固性会话。POE::Kernel->stop()
。exit()
及其同类。