【问题标题】:How to properly shut down POE and POE::Session?如何正确关闭 POE 和 POE::Session?
【发布时间】:2015-02-18 15:51:59
【问题描述】:

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

【问题讨论】:

    标签: perl poe


    【解决方案1】:

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

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

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

    一种是致电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。当真正的 SIGTERM 到达时,这实际上是 POE::Kernel 在幕后所做的。

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

    按照推荐的从高到低的顺序:

    • 以适当的意图关闭一切。
    • 使用 POE::Kernel->signal() 终止特定的顽固会话。
    • POE::Kernel->stop().
    • exit() 及其同类。

    【讨论】:

      【解决方案2】:

      我不认为这完全清楚..

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

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

      【讨论】:

      • 是的,我通常有监听器和定时器,POE::Kernel->delay 调用自身,amp 队列订阅者等等。结束事件循环等待某些任务而忽略其他任务的推荐方法是什么?
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多