如何正确关闭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()
,它至少允许对象 DESTROY
和 END
阻止 运行。如果您不希望他们不这样做,总有 POSIX::_exit()
代替。当然还有die()
如果您不想涉及操作系统,可以使用 POE::Kernel->signal(TERM => $kernel)
调用来注入伪造的 SIGTERM。当真正的 SIGTERM 到达时,这实际上是 POE::Kernel 在幕后所做的。
您还可以使用 POE::Kernel->signal()
向各个会话发送信号。作为模拟信号的好处之一是它不一定适用于整个程序。
从最推荐到最不推荐的顺序:
- 以适当的意图关闭一切。
- 使用
POE::Kernel->signal()
终止特定的顽固会话。
POE::Kernel->stop()
.
exit()
及其同类。
使用 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()
,它至少允许对象 DESTROY
和 END
阻止 运行。如果您不希望他们不这样做,总有 POSIX::_exit()
代替。当然还有die()
如果您不想涉及操作系统,可以使用 POE::Kernel->signal(TERM => $kernel)
调用来注入伪造的 SIGTERM。当真正的 SIGTERM 到达时,这实际上是 POE::Kernel 在幕后所做的。
您还可以使用 POE::Kernel->signal()
向各个会话发送信号。作为模拟信号的好处之一是它不一定适用于整个程序。
从最推荐到最不推荐的顺序:
- 以适当的意图关闭一切。
- 使用
POE::Kernel->signal()
终止特定的顽固会话。 POE::Kernel->stop()
.exit()
及其同类。