/ / Python: używanie menedżera procesów wieloprocesowych w puli procesów - python, kolejka, przetwarzanie wieloprocesowe

Python: używanie menedżera do wielu procesorów w puli procesów - python, kolejka, proces wieloprocesowy

Używam multiprocessing.managers.BaseManager do zarządzania kolejką po stronie serwera, próbuję użyć tej kolejki w innym skrypcie Pythona, który korzysta z puli procesów, ale zawsze dostaję komunikat o błędzie w następujący sposób, a główny kod tego skryptu w Pythonie jest również następujący: rozpocznie się od metody run ().

File "/usr/lib/python2.7/multiprocessing/connection.py", line 435, in answer_challenge
raise AuthenticationError("digest sent was rejected")
AuthenticationError: (AuthenticationError("digest sent was rejected",), <function RebuildProxy at 0x7ff8de0b8320>, (<function AutoProxy at 0x7ff8de0b7938>, Token(typeid="Queue", address=("localhost", 12345), id="7f4624039cd0"), "pickle", {"exposed": ("cancel_join_thread", "close", "empty", "full", "get", "get_nowait", "join_thread", "put", "put_nowait", "qsize")}))


def __init__(self, spider_count=cpu_count()):
self._spider_count = spider_count
mgr = MyManager(address=("localhost", 12345), authkey="xxxxx")
server = mgr.connect()
self._queue = mgr.Queue()

def run(self):
pool = Pool(self._spider_count)
while not self._queue.empty():
#add some control on q.get() if queue is empty
pool.apply_async(self.startCrawl, (self._queue.get(),))
pool.close()
pool.join()

ale kiedy używam go w jednym wątku, działa dobrze, gdy korzystam z puli, pojawia się ten komunikat o błędzie.

Odpowiedzi:

0 dla odpowiedzi № 1

To brzmi jak problem opisany w http://bugs.python.org/issue7503

W praktyce wszystkie procesy korzystające z menedżera powinny mieć current_process().authkey ustawione na tę samą wartość.

Zatem poprawką byłoby przypisanie __init__:

multiprocessing.current_process().authkey = "xxxxx"