2
我有一個GCE服務器設置來處理一些數據分析。我可以通過使用twisted
與它溝通。我是這臺服務器的唯一客戶端。強制加捻反應器在sigterm上停止
系統是安裝程序是這樣的:
spawn_multiprocessing_hierarchy()
reactor.run() # Blocks main thread
stop_everything_and_cleanup()
當我試圖阻止系統和客戶端連接,reactor
會忽略(?或者是無限期地拖延下去)SIGTERM
,因爲它是處理客戶端的連接。但是,系統的每個其他部分都是容錯的,並且reactor
從來沒有處理任何關鍵數據。它僅用於監視目的。這意味着我可以很容易地將SIGKILL
這不是用於需要在內存中轉儲數據的其他multiprocess.Process
es,以便它們可以在下次啓動時停止在最後停止的位置。
是否有可能讓SIGTERM
立即(無需等待反應堆中的運行任務完成)放下任何連接並停止反應堆?
我知道我的反應器不會停止,因爲任務正在運行。考慮到只有一個客戶端連接到服務器,我可以讓反應器執行一個非常長的任務,因爲我只需要一個同時在服務器上執行的任務。我希望使反應堆能夠完成它所做的任何任務,因爲這絕不是任務關鍵所在,並且在需要時延遲系統退出。 – Mirac7
解決這個問題的方法不是通過Twisted(即''reactor.spawnProcess'',''task.deferToThread'','threads.callInThread''等等)產生進程,而是手動管理進程對象並設置' 'daemon = True''。這種方式Twisted不會在乎那些線程/進程,他們只是在應用程序停止時「死掉」。 –