POE
调用POE::Kernel->stop()
导致立即关闭。如何请求优雅关闭,等待 yield、post、call FIFO 为空再关闭?
3 回答
我不认为这完全清楚..
yield、post 等将清空,最终您的脚本将关闭。“正常关闭”是一个概念,例如,您有一个套接字驱动的应用程序,并且您希望确保在“关闭/关闭套接字”之前通过套接字完成的所有活动活动。
所以也许解决方案不在 POE::Kernel 中,而是在您自己的代码中?
如果您创建删除别名和任何未完成警报的内联状态,您的会话应该正常结束。只有在等待事件返回或被另一个会话使用时,它才会保留。
结束事件循环等待某些任务而忽略其他任务的推荐方法是什么?
首先,等待您要完成的任务。
完成后,您有几个选项可以在剩余任务完成之前结束事件循环。
一是打电话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()
及其同类。