gpt4 book ai didi

python - 停止 Python Multiprocessing BaseManager 'serve_forever' 服务器?

转载 作者:行者123 更新时间:2023-11-28 18:21:15 25 4
gpt4 key购买 nike

我在 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()

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

这是根据 documentation 完成的.并且设置本身与调用共享实例的客户经理配合得很好。

但是,我找不到停止这个“serve_forever”服务器的方法。由于文档没有提到这一点,我检查了 source code .有一个 stop_event,据说我可以 set 退出循环。但它不起作用,因为 accepter 守护进程/线程仍在运行。而且我无法在服务器对象上调用 shutdown,因为我没有套接字对象 c

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

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

最佳答案

在服务器中试试这个:

import threading

s = m.get_server()
stop_timer = threading.Timer(1, lambda:s.stop_event.set())
MyManager.register('stop', callable=lambda:stop_timer.start())
s.serve_forever()

在客户端:

MyManager.register('stop')
m.stop()

更新:

我通过使用 threading.Timer 延迟 stop_event.set() 解决了超时问题

旧:

但是,在机器之间,由于 stop() 方法无法接收数据,您会遇到长时间超时,这个答案谈到了这一点 - 但我无法让它工作:

properly disconnect multiprocessing remote manager

我是多处理管理器的新手,如果我找到更好的解决方案,我会更新这个答案。 (更新:找到,更新)

关于python - 停止 Python Multiprocessing BaseManager 'serve_forever' 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44940164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com