使用POE调用POE::Kernel->stop()会导致立即关闭。一个人如何要求一个优雅的关闭,等待产量,张贴,调用FIFO是空的,然后关闭?
发布于 2015-04-02 19:57:26
什么是建议的方法来结束事件循环等待某些任务,而忽略其他任务?
首先,等待你想要完成的任务。
在它们完成之后,您有几个选项可以在剩余任务完成之前结束事件循环。
一个是打电话给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。这实际上就是POE::内核在真正的SIGTERM到达时在幕后所做的事情。
您还可以使用POE::Kernel->signal()向各个会话发送信号。作为一个模拟信号的好处之一是它不一定是整个程序的作用域。
以最-至最低-建议的顺序:
POE::Kernel->signal()杀死特定的顽固性会话。POE::Kernel->stop()。exit()及其同类。发布于 2015-02-27 15:36:53
我不认为这是完全清楚..。
产量,post等将为空,最终您的脚本将关闭。“优雅关闭”是一个概念,例如,您有一个套接字驱动的应用程序,并且您希望在“关闭/关闭套接字”之前确保所有通过套接字完成而产生的活动。
因此,也许解决方案不是POE::内核内部的问题,而是在您自己的代码中?
发布于 2015-03-03 21:47:45
如果创建内联状态以删除别名和任何未处理的警报,则会话应优雅地结束。只有在等待某个事件返回或被另一个会话使用时,它才会保留。
https://stackoverflow.com/questions/28587833
复制相似问题