我在Python 3.6以下設置用於進程間通信:停止Python多處理BaseManager'serve_forever'服務器?
from multiprocessing.managers import BaseManager
class MyManager(BaseManager): pass
MyManager.register('get_instance', callable=lambda:my_instance)
m = MyManager(address=('', 50000), authkey=b'key')
s = m.get_server()
s.serve_forever()
爲了避免阻塞較大的應用的我的消息循環中,我使用一個線程來包含這個設置。所以s.serve_forever()
實際上在一個線程的run
函數內運行。
這是根據documentation完成的。客戶經理調用共享實例時,設置本身也可以正常工作。
但是,我發現沒有辦法阻止這個'serve_forever'服務器。由於文件沒有提到這一點,我檢查了source code。有一個stop_event
據說我可以set
退出循環。但它不起作用,因爲accepter
守護進程/線程仍在運行。我不能在服務器對象上調用shutdown
,因爲我沒有套接字對象c
。
那麼如何關閉此服務器?
ps。使用BaseManager.start()
對我來說不是一個真正的選擇,因爲我的服務器共享一個只能由啓動進程訪問的異步消息循環。 BaseManager.start()
會產生一個不再有權訪問消息循環的新進程。另一方面,在調用過程中運行。
這個名字意味着它會永遠運行。你什麼時候想關閉它?退出程序時,或在您方便的時候? – JohanL
另外,你有沒有嘗試在你的主應用程序中運行'serve_forever()'?它會創建一個線程來自動運行。你確定它會阻止你的消息循環? – JohanL