2013-04-09 19 views
7

Sto cercando di ottenere una comprensione di base prima di creare l'applicazione effettiva di cui ho bisogno. Recentemente mi sono trasferito dal 2,7 al 3,3.Il codice concurrent.futures di esempio non funziona con "BrokenProcessPool"

Una copia-incolla diretta di this code from the python docs non riesce, così come un esempio leggermente più semplice da here.

Questo è il mio codice, derivato dal secondo esempio:

import concurrent.futures 

nums = [1,2,3,4,5,6,7,8,9,10] 

def f(x): 
    return x * x 

# Make sure the map and function are working 
print([val for val in map(f, nums)]) 

# Test to make sure concurrent map is working 
with concurrent.futures.ProcessPoolExecutor() as executor: 
    for item in executor.map(f, nums): 
     print(item) 

E questo è l'output:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 
Traceback (most recent call last): 
    File "<string>", line 420, in run_nodebug 
    File "<module1>", line 13, in <module> 
    File "C:\Python33\lib\concurrent\futures\_base.py", line 546, in result_iterator 
    yield future.result() 
    File "C:\Python33\lib\concurrent\futures\_base.py", line 399, in result 
    return self.__get_result() 
    File "C:\Python33\lib\concurrent\futures\_base.py", line 351, in __get_result 
    raise self._exception 
concurrent.futures.process.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending. 

Come posso ottenere questo codice a funzionare come previsto? Speravo che gli esempi funzionassero appena fuori dagli schemi.

risposta

8

Questa è stata colpa mia, per due motivi:

  1. il codice è stato non-sorvegliato, cioè senza if __name__
  2. La strana cercando Traceback era perché il file non è stato salvato. Non mi ha mai causato problemi prima, ma in questo caso.

Correggere sia di quelli riparati l'errore.

codice finale di test:

import concurrent.futures 

nums = [1,2,3,4,5,6,7,8,9,10] 

def f(x): 
    return x * x 
def main(): 
    # Make sure the map and function are working 
    print([val for val in map(f, nums)]) 

    # Test to make sure concurrent map is working 
    with concurrent.futures.ProcessPoolExecutor() as executor: 
     print([val for val in executor.map(f, nums)]) 

if __name__ == '__main__': 
    main() 

uscita, come ci si aspettava:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 
0

In Windows, è importante per proteggere il ciclo principale di codice per evitare la deposizione delle uova ricorsiva di sottoprocessi quando si utilizza processpoolexecutor o qualsiasi altro codice parallelo che genera nuovi processi.

Fondamentalmente, tutto il codice che crea nuovi processi deve essere inferiore a if __name__ == '__main__':, per lo stesso motivo per cui non è possibile eseguirlo nell'interprete.

Problemi correlati