2010-05-06 12 views
53

Sé que esto ha sido respondido antes, pero parece que la ejecución del script directamente "python filename.py" no funciona. Tengo Python 2.6.2 en SuSE Linux.otra confusión más con error de multiprocesamiento, el objeto 'módulo' no tiene el atributo 'f'

Código:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from multiprocessing import Pool 
p = Pool(1) 
def f(x): 
    return x*x 
p.map(f, [1, 2, 3]) 

Línea de comandos:

> python example.py 
Process PoolWorker-1: 
Traceback (most recent call last): 
File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap 
    self.run() 
File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run 
    self._target(*self._args, **self._kwargs) 
File "/usr/lib/python2.6/multiprocessing/pool.py", line 57, in worker 
    task = get() 
File "/usr/lib/python2.6/multiprocessing/queues.py", line 339, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'f' 
+1

posible duplicado de [Utilización pitón multiprocesamiento piscina en el terminal y en moudles de código para Django o Flask] (http://stackoverflow.com/questions/18947876/using-python-multiprocessing-pool -in-the-terminal-and-in-code-moudles-for-django) –

+0

@jb. esa publicación es mucho más tardía que esta, esto fue en 2010, esa es 2013 – gatoatigrado

+2

La edad es irrevelante, hay consenso en meta, esa pregunta con mejor respuesta debe ser elegida, y otra tiene mejor respuesta de IMO. –

Respuesta

98

Reestructurar el código para que la función f() se defina antes de crear la instancia de Pool. De lo contrario, el trabajador no puede ver su función.

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

from multiprocessing import Pool 

def f(x): 
    return x*x 

p = Pool(1) 
p.map(f, [1, 2, 3]) 
+3

increíble, ¡muchas gracias! ¡Qué uso críptico! – gatoatigrado

+1

NOTA: unos años más tarde, comencé a escribir una alternativa imap [https://github.com/gatoatigrado/vimap], lo que hace que este error sea más difícil (y lo deja en claro cuando se bifurcan los hilos). – gatoatigrado

+1

@Bartosz, ¿Tiene alguna idea de por qué esto no es un problema en los portátiles ipython? – Framester

4

Esta funciona:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == "__main__": 
    p = Pool(1) 
    p.map(f, [1, 2, 3]) 

No estoy 100% seguro de por qué su código no funciona, pero yo Supongo que la razón es que los procesos secundarios iniciados por el módulo multiprocessing intentan importar el módulo principal (para tener acceso a los métodos que definió) y la estrofa if __name__ == "__main__" es necesaria para no ejecutar el código de inicialización donde configuró su grupo.

+0

Si uno tiene que ejecutar dicho código a través de un intérprete en Windows, ¿hay algún problema? Esta es la situación en la que me veo confrontado con la programación de Python-Fu desde el complemento de Gimp Python Console. – jxramos

+0

Este no funcionó para mí –

1

Una posibilidad es que el archivo de Python tiene el mismo nombre que un módulo:

  • test.py
  • prueba/
    • __init__.py

en pickle.py, tiene el error de venir g a partir de:

def find_class(self, module, name): 
     # Subclasses may override this 
     __import__(module) 
     mod = sys.modules[module] # <- here mod will reference your test/__init__.py 
     klass = getattr(mod, name) 
     return klass 
Cuestiones relacionadas