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

How to properly shut down POE and POE::Session?

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

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

产量、post 等将清空,最终您的脚本将关闭。 'graceful shut down' 是一个概念,例如,您有一个套接字驱动的应用程序,并且您希望确保通过套接字产生的所有活动活动在 'shutting down/closing the socket'.

之前完成。

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

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

What would be the recommended approach to end up the event loop waiting for certain tasks while ignoring others?

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

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

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

还有一种就是杀进程。 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() 及其同类。