2016-11-11 16 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不會在乎那些線程/進程,他們只是在應用程序停止時「死掉」。 –