![](/img/trans.png)
[英]Stopping a Python Multiprocessing BaseManager 'serve_forever' server?
[英]Connecting to Multiprocessing BaseManager works locally but not for remote server
我目前正在使用multiprocessing.managers.BaseManager功能來提供一些 Python 對象,以便我可以在客戶端與它們的代理進行交互。
啟動 BaseManager 定義的服務器后,我嘗試在客戶端連接以訪問可服務對象。 但是,只有當服務器和客戶端存在於不同的主機上時,我才會看到EoFError
。 如果他們在同一個本地主機上,我可以很好地訪問。
服務器.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 ...
客戶端.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
我剛剛遇到了同樣的問題,但幸運的是,我在調試過程中修改代碼時創造了一個線索
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.