Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停止Python多处理BaseManager';永远为你服务';服务器?_Python_Python 3.x_Process_Multiprocessing_Python Multiprocessing - Fatal编程技术网

停止Python多处理BaseManager';永远为你服务';服务器?

停止Python多处理BaseManager';永远为你服务';服务器?,python,python-3.x,process,multiprocessing,python-multiprocessing,Python,Python 3.x,Process,Multiprocessing,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.se

我在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\u forever()
实际上在线程的
run
函数中运行

这是根据标准进行的。设置本身在客户端管理器调用共享实例时运行良好

然而,我没有办法阻止这个“永远服务”的服务器。由于文档中没有提到这一点,我检查了。有一个
stop\u事件
,我可以
设置它来退出循环。但是它没有工作,因为
接受程序
守护进程/线程仍在运行。我不能对服务器对象调用
shutdown
,因为我没有套接字对象
c

那么我如何关闭这台服务器呢


另外,对我来说,使用
BaseManager.start()
并不是一个真正的选项,因为在我的例子中,服务器共享一个异步消息循环,该循环只能由启动进程访问
BaseManager.start()
生成一个新进程,该进程不再具有对消息循环的访问权限<代码>获取服务器()。永久服务()
另一方面,在调用过程中运行。

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


在服务器中尝试以下操作:

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\u事件.set()
解决了超时问题

旧的:

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


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

该名称意味着它将永远运行。你想什么时候关机?退出程序时,或在您方便的时候?另外,您是否尝试过在主应用程序中运行
serve_forever()
?它将创建一个自动运行的线程。您确定它会阻止您的邮件循环吗?
MyManager.register('stop')
m.stop()