我目前正在使用multiprocessing.managers.BaseManager功能为一些Python对象提供服务,这样我就可以在客户端与它们的代理进行交互。
启动BaseManager定义的服务器后,我尝试在客户端进行连接以访问可服务对象。但是,只有当服务器和客户端存在于不同的主机上时,我才会看到EoFError
。如果他们在同一台本地主机上,我可以很好的访问。
server.py
from multiprocessing.managers import BaseManager
password = "password".encode("utf-8")
class MyManager(BaseManager):
pass
a = {'one': 1} # to be served
MyManager.register("get_a", callable=lambda: a)
m = MyManager(address=("127.0.0.1", 60000), authkey=password)
m.start()
# ... long running process ...
client.py
from multiprocessing.managers import BaseManager
password = "password".encode("utf-8")
class MyManager(BaseManager):
pass
MyManager.register("get_a")
manager = MyManager(address=("SERVER_IP", 60000), authkey=password)
manager.connect() # raises EoFError
回溯:
File "client.py", line 20, in connect_to_executor_manager
manager.connect()
File "/usr/lib/python3.7/multiprocessing/managers.py", line 512, in connect
conn = Client(self._address, authkey=self._authkey)
File "/usr/lib/python3.7/multiprocessing/connection.py", line 498, in Client
answer_challenge(c, authkey)
File "/usr/lib/python3.7/multiprocessing/connection.py", line 741, in answer_challenge
message = connection.recv_bytes(256) # reject large message
File "/usr/lib/python3.7/multiprocessing/connection.py", line 216, in recv_bytes
buf = self._recv_bytes(maxlength)
File "/usr/lib/python3.7/multiprocessing/connection.py", line 407, in _recv_bytes
buf = self._recv(4)
File "/usr/lib/python3.7/multiprocessing/connection.py", line 383, in _recv
raise EOFError
发布于 2022-09-15 14:17:48
我只是遇到了同样的问题,但幸运的是,当我在调试过程中修改代码时,我创建了一个线索。
from multiprocessing.managers import BaseManager
password = "password".encode("utf-8")
class MyManager(BaseManager):
pass
a = {'one': 1} # to be served
MyManager.register("get_a", callable=lambda: a)
m = MyManager(address=("127.0.0.1", 60000), authkey=password)
print(f"serving at address {m.address}") # I added the equivalent of this line
m.start()
我的测试代码导致了“送达地址.”列印两次。这让我觉得代码被生成了两次。我记得在某个地方看到服务器代码应该包含在一个if __name__ == ...
块中,所以我试了一下,事情就开始起作用了。
我不是专家,但我认为这个错误是在产卵/分叉/等过程中引起的。长话短说,您可以像这样修改您的server.py
代码,它可能会工作。
from multiprocessing.managers import BaseManager
password = "password".encode("utf-8")
class MyManager(BaseManager):
pass
a = {'one': 1} # to be served
MyManager.register("get_a", callable=lambda: a)
if __name__ == '__main__':
m = MyManager(address=("127.0.0.1", 60000), authkey=password)
m.start()
https://stackoverflow.com/questions/72511606
复制