python - set_start_method - otra confusión con el error de multiprocesamiento, el objeto ''módulo'' no tiene el atributo ''f''
python multithreading (4)
Sé que esto ha sido respondido antes, pero parece que ejecutar el script directamente "python filename.py" no funciona. Tengo Python 2.6.2 en SuSE Linux.
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 comando:
> 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''
El problema que tenía se resolvió usando if __name__ == "__main__"
como lo señaló Tamás; en Eclipse para Windows, los ejemplos no funcionan bajo el intérprete. Esto se explica en http://docs.python.org/2/library/multiprocessing
Este 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é tu código no funciona, pero creo que la razón es que los procesos secundarios iniciados por el módulo de multiprocessing
intentan importar el módulo principal (para tener acceso a los métodos que definiste), y if __name__ == "__main__"
Se requiere la estrofa if __name__ == "__main__"
para no ejecutar el código de inicialización donde configuraste tu grupo.
Reestructura tu código para que la función f()
esté definida antes de crear una 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])
Una posibilidad es que su archivo python tenga el mismo nombre que un módulo:
- test.py
- prueba/
- __init__.py
en pickle.py, tiene el error proveniente 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