2012-03-12 26 views
6

Desarrollo con Python en Linux y nunca he visto realmente este tipo de problema con Windows. Estoy usando la biblioteca multiprocessing para acelerar los cálculos, lo que me funciona muy bien en Linux.Multiprocesamiento en Windows se rompe

En Windows, sin embargo, las cosas no funcionan tan bien:

* [INFO] Parsing 1 file using 2 threads 

Traceback (most recent call last): 
    File "main.py", line 170, in <module> 
    master = ParsingMaster(parser, list(input_file), output_list, threads=num_threads) 
Traceback (most recent call last): 
    File "main.py", line 39, in __init__ 
    File "<string>", line 1, in <module> 
    self.input_process.start() 
    File "C:\Python26\lib\multiprocessing\forking.py", line 342, in main 
    File "C:\Python26\lib\multiprocessing\process.py", line 104, in start 
     self._popen = Popen(self) 
self = load(from_parent) 
    File "C:\Python26\lib\multiprocessing\forking.py", line 239, in __init__ 
    File "C:\Python26\lib\pickle.py", line 1370, in load 
    dump(process_obj, to_child, HIGHEST_PROTOCOL) 
    File "C:\Python26\lib\multiprocessing\forking.py", line 162, in dump 
    ForkingPickler(file, protocol).dump(obj) 
    File "C:\Python26\lib\pickle.py", line 224, in dump 
    return Unpickler(file).load() 
    self.save(obj) 
File "C:\Python26\lib\pickle.py", line 858, in load 
    File "C:\Python26\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python26\lib\pickle.py", line 419, in save_reduce 
    dispatch[key](self) 
    File "C:\Python26\lib\pickle.py", line 880, in load_eof 
    save(state) 
    File "C:\Python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    r aise EOFError 
File "C:\Python26\lib\pickle.py", line 649, in save_dict 
EOFError 
    self._batch_setitems(obj.iteritems()) 
    File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems 
    save(v) 
    File "C:\Python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python26\lib\multiprocessing\forking.py", line 40, in dispatcher 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python26\lib\pickle.py", line 401, in save_reduce 
    save(args) 
    File "C:\Python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python26\lib\pickle.py", line 548, in save_tuple 
    save(element) 
    File "C:\Python26\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python26\lib\pickle.py", line 419, in save_reduce 
    save(state) 
    File "C:\Python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python26\lib\pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems 
    save(v) 
    File "C:\Python26\lib\pickle.py", line 306, in save 
    rv = reduce(self.proto) 
    File "C:\Python26\lib\multiprocessing\managers.py", line 458, in __reduce__ 
    return type(self).from_address, \ 
AttributeError: type object 'SyncManager' has no attribute 'from_address' 

Estoy probando tanto en Python 2.6 y 2.7 en Windows 7 y obtener este mismo error una y otra vez. ¿Alguien sabe lo que significa?

+1

¿Leyó [la documentación específica de la plataforma] (http://docs.python.org/library/multiprocessing.html#windows), especialmente la primera restricción? –

+0

Gracias, acabo de hacerlo. Solo estoy usando listas como argumentos para toda la clase, por lo que no debería haber ningún error de decapado. Tampoco estoy subclasificando el proceso. – Blender

Respuesta

7

hay restricciones en Windows, aquí es las partes correspondientes a los errores que está viendo:

Since Windows lacks os.fork() it has a few extra restrictions:

Más picklability

Asegúrese de que todos los argumentos a Process.__init__() son estibables. Esto significa, en particular, que los métodos vinculados o no vinculados no se pueden usar directamente como el argumento de destino en Windows - simplemente defina una función y úsela en su lugar.

Además, si subclase Process, asegúrese de que las instancias serán seleccionables cuando se llame al método Process.start().

Esto significa que algo que se pasa como argumento a Process.__init__()isn't able to be pickled or unpickled (una serialización en Python). ¿Qué es SyncManager se queja de no poder encontrar atributos en ese objeto AttributeError: type object 'SyncManager' has no attribute 'from_address', es probable que sea su causa raíz. ¿Puede ese objeto SyncManager en realidad ser escabechado, does it meet the pickle rules?

Si está ejecutando esto desde el command line on Windows, you can't do that aparentemente.

No hagas eso. Guarde el código en un archivo y ejecútelo desde el archivo, con el comando:

python myfile.py 

Eso resolverá su problema.

+0

Acabo de leer eso, gracias. ¿Sabes lo que significa? Solo estoy usando listas como argumentos para toda la clase, por lo que no debería haber ningún error de decapado. No estoy subclasificando 'Proceso' tampoco. – Blender

+0

Estoy ejecutando el archivo a través de la línea de comandos de Windows. En cuanto a 'SyncManager', nunca lo definí. Es parte de 'multiprocesamiento 'por lo que puedo decir. – Blender

+0

No puede ejecutarlo en la consola interactiva, pero ejecutar el script escribiendo 'python abc.py' en la línea de comando funciona bien. – Dikei

Cuestiones relacionadas