【问题标题】:Force twisted reactor to stop on sigterm强制扭曲反应堆在 sigterm 上停止
【发布时间】:2017-03-25 12:54:43
【问题描述】:

我有一个 GCE 服务器设置来处理一些数据分析。我可以使用twisted 通过ws 与它通信。我是这台服务器的唯一客户端。

系统设置如下:

spawn_multiprocessing_hierarchy()
reactor.run()  # Blocks main thread
stop_everything_and_cleanup()

当我试图停止系统并且客户端已连接时,reactor 将忽略(或可能无限期延迟?)SIGTERM,因为它正在处理客户端的连接。但是,系统的所有其他部分都是容错的,reactor从不处理任何关键数据。它的存在仅用于监控目的。这意味着我可以很容易地SIGKILL,如果不是其他需要将数据转储到内存中的multiprocess.Processes,以便他们可以在下次启动时从上次停止的地方继续。

是否可以让SIGTERM 立即(无需等待反应器中正在运行的任务完成)断开任何连接并停止反应器?

【问题讨论】:

    标签: python twisted reactor twisted.internet sigterm


    【解决方案1】:

    如果没有看到您的其余代码,就很难假设确切的问题是什么。一般来说,当reactor没有停止时,是因为一个任务正在一个线程或进程中运行。 Twisted 将尝试做“正确的事情”,并等到所有线程/进程都完成后再退出。当反应器停止时,您可以通过reactor.addSystemEventTrigger 添加一个事件。

    【讨论】:

    • 我知道我的反应器不会因为任务正在运行而停止。鉴于只有一个客户端连接到服务器,我可以让反应器执行一个很长的任务,因为我只需要一个同时在服务器上执行。我想让反应堆放弃它正在做的任何任务,因为它从来都不是关键任务,而且它会在需要时延迟系统退出。
    • 解决此问题的一种方法是不通过 Twisted 生成进程(即reactor.spawnProcesstask.deferToThreadthreads.callInThread 等),而是手动管理进程对象并设置daemon = True。这样,Twisted 就不会关心那些线程/进程,当你的应用停止时它们只会“死掉”。
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 2014-03-16
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    相关资源
    最近更新 更多