2016-11-11 75 views
2

我有一个GCE服务器设置来处理一些数据分析。我可以通过使用twisted与它沟通。我是这台服务器的唯一客户端。强制加捻反应器在sigterm上停止

系统是安装程序是这样的:

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

当我试图阻止系统和客户端连接,reactor会忽略(?或者是无限期地拖延下去)SIGTERM,因为它是处理客户端的连接。但是,系统的每个其他部分都是容错的,并且reactor从来没有处理任何关键数据。它仅用于监视目的。这意味着我可以很容易地将SIGKILL这不是用于需要在内存中转储数据的其他multiprocess.Process es,以便它们可以在下次启动时停止在最后停止的位置。

是否有可能让SIGTERM立即(无需等待反应堆中的运行任务完成)放下任何连接并停止反应堆?

回答

0

没有看到你的代码的其余部分,很难假定确切的问题是什么。通常,当反应器不停止时,这是因为任务正在线程或进程中运行。扭曲会尝试做“正确的事情”,并会等到所有线程/进程在退出之前完成。当通过reactor.addSystemEventTrigger停止反应堆时,您可以添加一个事件。

+0

我知道我的反应器不会停止,因为任务正在运行。考虑到只有一个客户端连接到服务器,我可以让反应器执行一个非常长的任务,因为我只需要一个同时在服务器上执行的任务。我希望使反应堆能够完成它所做的任何任务,因为这绝不是任务关键所在,并且在需要时延迟系统退出。 – Mirac7

+0

解决这个问题的方法不是通过Twisted(即''reactor.spawnProcess'',''task.deferToThread'','threads.callInThread''等等)产生进程,而是手动管理进程对象并设置' 'daemon = True''。这种方式Twisted不会在乎那些线程/进程,他们只是在应用程序停止时“死掉”。 –