2015-04-17 11 views
8

I worte un programma di multiprocessing in python. Io uso multiprocessing.Manager().list() per condividere l'elenco all'interno del sottoprocesso. Inizialmente, aggiungo alcune attività nel processo principale. Quindi, avviare alcuni sottoprocessi per eseguire attività che, nell'elenco condiviso, i processi secondari aggiungono anche attività all'elenco condiviso. Ma ho ottenuto un'eccezione come segue:errore elenco gestore multiprocessing python: [Errno 2] Nessun file o directory tale

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 

trovo qualcosa su come utilizzare elenco condiviso in Python multiprocessing come this. Ma hanno ancora qualche eccezione. Non ho idea del significato dell'eccezione. E qual è la differenza tra la lista comune e la manager.list?

il codice come segue:

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

Avrete bisogno di condividere abbastanza codice per riprodurre il problema per chiunque di dirvi che cosa è andato storto qui. Sembra che forse il manager si sia spento prima che tu provassi ad usarlo, ma è difficile dire senza vedere alcun codice. – dano

+0

Sembra che il codice utilizzi socket UNIX e non sia in grado di collegarsi al file socket. –

+0

@dano il codice è in [here] (https://github.com/stamaimer/MrUirf/blob/master/twitter/gen_friendship.py) – stamaimer

risposta

14

Il problema è che il processo principale è uscita subito dopo l'avvio di tutti i processi di lavoro, che spegne il vostro Manager. Quando il tuo Manager si spegne, nessuno dei bambini può utilizzare l'elenco condiviso che hai passato. Puoi aggiustarlo usando join per aspettare che tutti i bambini finiscano. Basta fare in modo che effettivamente start tutti i processi prima di chiamare join:

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

Sì, hai ragione. Grazie mille. E ho capito perché viene eseguito solo un processo. Non ho capito prima "unisciti". – stamaimer

+0

Questo dovrebbe avere un aumento di milioni. Ha risolto un problema che stavo risolvendo da un giorno all'altro. I processi venivano avviati mentre la coda veniva svuotata e altri processi venivano chiusi. – mudda

Problemi correlati