threading set_start_method ejemplos python multiprocessing

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''



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