2015-04-17 7 views
8

Ich worte ein Multiprocessing-Programm in Python. Ich verwende multiprocessing.Manager().list(), um die Liste innerhalb des Subprozesses freizugeben. Zuerst füge ich einige Aufgaben im Hauptprozess hinzu. Starten Sie dann einige Unterprozesse, um Aufgaben auszuführen, die in der freigegebenen Liste den Unterprozessen ebenfalls Aufgaben zur freigegebenen Liste hinzufügen. Aber ich habe eine Ausnahme wie folgt:Python Multiprocessing-Manager Liste Fehler: [Errno 2] Keine solche Datei oder Verzeichnis

Traceback (most recent call last): 
     File "/usr/lib64/python2.6/multiprocessing/process.py", line 232, in _bootstrap 
     self.run() 
     File "/usr/lib64/python2.6/multiprocessing/process.py", line 88, in run 
     self._target(*self._args, **self._kwargs) 
     File "gen_friendship.py", line 255, in worker 
     if tmpu in nodes: 
     File "<string>", line 2, in __contains__ 
     File "/usr/lib64/python2.6/multiprocessing/managers.py", line 722, in _callmethod 
     self._connect() 
     File "/usr/lib64/python2.6/multiprocessing/managers.py", line 709, in _connect 
     conn = self._Client(self._token.address, authkey=self._authkey) 
     File "/usr/lib64/python2.6/multiprocessing/connection.py", line 143, in Client 
     c = SocketClient(address) 
     File "/usr/lib64/python2.6/multiprocessing/connection.py", line 263, in SocketClient 
     s.connect(address) 
     File "<string>", line 1, in connect 
    error: [Errno 2] No such file or directory 

finde ich etwas darüber, wie wie this gemeinsame Liste in Python Multiprocessing zu verwenden. Aber immer noch eine Ausnahme. Ich habe keine Ahnung von der Bedeutung der Ausnahme. Und was ist der Unterschied zwischen der allgemeinen Liste und der manager.list?

der Code wie folgt:

nodes = multiprocessing.Manager().list() 

    lock = multiprocessing.Lock() 

    AMOUNT_OF_PROCESS = 10 

    def worker(): 
     lock.acquire() 
     nodes.append(node) 
     lock.release() 

    if __name__ == "__main__": 

     for i in range(i): 
      nodes.append({"name":"username", "group":1}) 

     processes = [None for i in range(AMOUNT_OF_PROCESS)] 

     for i in range(AMOUNT_OF_PROCESS): 
      processes[i] = multiprocessing.Process(taget=worker, args=()) 
      processes[i].start() 
+1

Sie müssen genug Code teilen das Problem für jedermann zu reproduzieren, Ihnen zu sagen, was hier schief ging. Es sieht so aus, als ob der Manager heruntergefahren wird, bevor Sie versuchen, es zu benutzen, aber es ist schwer zu sagen, ohne irgendeinen Code zu sehen. – dano

+0

Sieht aus, als ob der Code UNIX-Sockets verwendet und nicht an die Socket-Datei binden kann. –

+0

@dano der Code ist in [hier] (https://github.com/stamaimer/MrUirf/blob/master/twitter/gen_friendship.py) – stamaimer

Antwort

14

Das Problem ist, dass Ihr Hauptprozess sofort, nachdem Sie Ihr alle Startarbeitsprozesse wird beendet, die Ihr nach unten Manager schaltet. Wenn Ihr Manager beendet wird, kann keines der Kinder die freigegebene Liste verwenden, die Sie an sie übergaben. Sie können es reparieren, indem Sie join verwenden, um auf alle Kinder zu warten, um zu beenden. So stellen Sie sicher, dass Sie tatsächlich start alle Ihre Prozesse vor join dem Aufruf:

for i in range(AMOUNT_OF_PROCESS): 
    processes[i] = multiprocessing.Process(taget=worker, args=()) 
    processes[i].start() 
for process in processes: 
    process.join() 
+0

Ja, Sie haben Recht. Vielen Dank. Und ich habe herausgefunden, warum nur ein Prozess läuft. Ich habe nicht verstanden "Join" vorher. – stamaimer

+0

Dies sollte eine Million Upvotes haben. Es löste ein Problem, das ich einen Tag lang behoben hatte. Die Prozesse wurden gestartet, während die Warteschlange geleert wurde und andere Prozesse heruntergefahren wurden. – mudda

Verwandte Themen