如何正确关闭POE和POE :: Session?

时间:2015-02-18 15:51:59

标签: perl poe

POE调用POE::Kernel->stop()导致立即关闭。在关闭之前,如何请求正常关闭,等待yield,post,调用FIFO为空?

3 个答案:

答案 0 :(得分:1)

我不认为这是完全清楚的。

收益率,邮政等将清空,最终您的脚本将关闭。 “优雅关闭”是一种概念,例如,当您使用套接字驱动的应用程序时,您希望确保在“关闭/关闭套接字”之前通过套接字完成所有活动活动。

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

答案 1 :(得分:1)

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

答案 2 :(得分: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()及其同类。