簡體   English   中英

連接到 Multiprocessing BaseManager 在本地工作,但不適用於遠程服務器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM