停止Python Multiprocessing BaseManager“serve_forever”服务器?

He *_*ing 7 python process multiprocessing python-3.x python-multiprocessing

我在 Python 3.6 中进行了以下进程间通信设置:

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()
Run Code Online (Sandbox Code Playgroud)

为了避免阻塞较大应用程序的消息循环,我使用了一个线程来包含此设置。所以s.serve_forever()实际上是在run一个线程的函数内部运行的。

这是根据文档完成的。而且设置本身可以很好地与调用共享实例的客户经理一起使用。

然而,我发现没有办法停止这个“serve_forever”服务器。由于文档没有提到这一点,所以我检查了源代码。据说stop_event我可以set退出循环。但它不起作用,因为accepter守护进程/线程仍在运行。我无法调用shutdown服务器对象,因为我没有套接字对象c

那么我该如何关闭这个服务器呢?

附:使用BaseManager.start()对我来说并不是一个真正的选择,因为在我的例子中,服务器共享一个只能由启动进程访问的异步消息循环。BaseManager.start()产生一个不再有权访问消息循环的新进程。get_server().serve_forever()另一方面,在调用进程内运行。

Waj*_*jih 1

您可以包装/使用管理器启动/关闭来避免服务器永远运行(start() 为您启动服务器):

m = MyManager(address=('', 50000), authkey=b'key')
m.start()
# do something
m.shutdown()
Run Code Online (Sandbox Code Playgroud)