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