Python 强迫扭曲的反应堆停止运行

Python 强迫扭曲的反应堆停止运行,python,twisted,reactor,twisted.internet,sigterm,Python,Twisted,Reactor,Twisted.internet,Sigterm,我有一个GCE服务器设置来处理一些数据分析。我可以通过ws使用twisted与它通信。我是此服务器的唯一客户端 系统设置如下: spawn_multiprocessing_hierarchy() reactor.run() # Blocks main thread stop_everything_and_cleanup() 当我试图停止系统并连接客户端时,reactor将忽略(或无限期延迟?SIGTERM,因为它正在处理客户端的连接。但是,系统的每个其他部分都是容错的,reactor从不处理

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

系统设置如下:

spawn_multiprocessing_hierarchy()
reactor.run()  # Blocks main thread
stop_everything_and_cleanup()
当我试图停止系统并连接客户端时,
reactor
将忽略(或无限期延迟?
SIGTERM
,因为它正在处理客户端的连接。但是,系统的每个其他部分都是容错的,
reactor
从不处理任何关键数据。它的存在仅用于监测目的。这意味着我可以轻松地
SIGKILL
如果不是其他
multi-Process.Process
es,它们需要将数据转储到内存中,以便可以在下次启动时最后停止的位置继续


有没有可能让
SIGTERM
立即(不等待reactor中运行的任务完成)断开任何连接并停止reactor?

如果看不到代码的其余部分,就很难假设确切的问题是什么。通常,当反应器没有停止时,是因为任务正在线程或进程中运行。Twisted将尝试做“正确的事情”,并在退出之前等待所有线程/进程完成。您可以通过
reactor.addSystemEventTrigger

在反应堆停止时添加事件。我知道我的反应堆不会因为任务正在运行而停止。考虑到只有一个客户端连接到服务器,我可以让reactor执行一个很长的任务,因为我只需要在服务器上同时执行一个。我想让reactor放弃它正在做的任何任务,因为它从来都不是任务关键型的,而且它会在需要时延迟系统退出。解决这个问题的一个方法是不通过Twisted生成进程(即
reactor.spawnProcess
task.deferToThread
threads.callInThread
,等等),而是手动管理流程对象并设置
daemon=True
。这样一来,Twisted就不会关心那些线程/进程,当你的应用程序停止时,它们就会“消亡”。