3

POE调用POE::Kernel->stop()导致立即关闭。如何请求优雅关闭,等待 yield、post、call FIFO 为空再关闭?

4

3 回答 3

1

我不认为这完全清楚..

yield、post 等将清空,最终您的脚本将关闭。“正常关闭”是一个概念,例如,您有一个套接字驱动的应用程序,并且您希望确保在“关闭/关闭套接字”之前通过套接字完成的所有活动活动。

所以也许解决方案不在 POE::Kernel 中,而是在您自己的代码中?

于 2015-02-27T15:36:53.787 回答
1

如果您创建删除别名和任何未完成警报的内联状态,您的会话应该正常结束。只有在等待事件返回或被另一个会话使用时,它才会保留。

于 2015-03-03T21:47:45.743 回答
1

结束事件循环等待某些任务而忽略其他任务的推荐方法是什么?

首先,等待您要完成的任务。

完成后,您有几个选项可以在剩余任务完成之前结束事件循环。

一是打电话POE::Kernel->stop()。这将停止事件循环,主POE::Kernel->run()调用将返回。通常在那之后没有什么可做的,但有些程序会在那里一次性完成。

另一个是杀死进程。 kill(TERM => $$). 使用会导致操作系统终止进程的信号。不过,这非常苛刻。

POE::Kernel->sig()您可以通过在调用中注册 SIGTERM 处理程序来减轻打击。这将让您在 SIGTERM 到达时运行一些代码,但它再次将关闭所有内容的负担放在您的程序上。

其他苛刻的选项包括exit(),这将至少允许对象DESTROYEND块运行。如果你宁愿他们没有,总有POSIX::_exit()相反的。die()当然还有。

如果您不想涉及操作系统,则POE::Kernel->signal(TERM => $kernel)可以使用该调用来注入伪造的 SIGTERM。当真正的 SIGTERM 到达时,这实际上是 POE::Kernel 在幕后所做的。

您还可以使用POE::Kernel->signal()将信号发送到各个会话。作为模拟信号的好处之一是它不一定适用于整个程序。

以最推荐到最不推荐的顺序:

  • 以适当的意图关闭一切。
  • 用于杀死POE::Kernel->signal()特定的顽固会话。
  • POE::Kernel->stop().
  • exit()及其同类。
于 2015-04-02T19:57:26.640 回答