2

我在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()會產生一個不再有權訪問消息循環的新進程。另一方面,在調用過程中運行。

+0

這個名字意味着它會永遠運行。你什麼時候想關閉它?退出程序時,或在您方便的時候? – JohanL

+0

另外,你有沒有嘗試在你的主應用程序中運行'serve_forever()'?它會創建一個線程來自動運行。你確定它會阻止你的消息循環? – JohanL

回答

0

你可以用/使用管理器啓動/關機,以避免這種永遠正在運行的服務器(start()啓動的服務器你):

m = MyManager(address=('', 50000), authkey=b'key') 
m.start() 
# do something 
m.shutdown()