Karşılaştığım sorun, küreselleri modüller arasında içe aktarmaya çalışmaktı ve ProcessPool () satırının birden çok kez değerlendirilmesine neden oluyordu.
globals.py
from processing import Manager, Lock
from pathos.multiprocessing import ProcessPool
from pathos.threading import ThreadPool
class SingletonMeta(type):
def __new__(cls, name, bases, dict):
dict['__deepcopy__'] = dict['__copy__'] = lambda self, *args: self
return super(SingletonMeta, cls).__new__(cls, name, bases, dict)
def __init__(cls, name, bases, dict):
super(SingletonMeta, cls).__init__(name, bases, dict)
cls.instance = None
def __call__(cls,*args,**kw):
if cls.instance is None:
cls.instance = super(SingletonMeta, cls).__call__(*args, **kw)
return cls.instance
def __deepcopy__(self, item):
return item.__class__.instance
class Globals(object):
__metaclass__ = SingletonMeta
"""
This class is a workaround to the bug: AssertionError: daemonic processes are not allowed to have children
The root cause is that importing this file from different modules causes this file to be reevalutated each time,
thus ProcessPool() gets reexecuted inside that child thread, thus causing the daemonic processes bug
"""
def __init__(self):
print "%s::__init__()" % (self.__class__.__name__)
self.shared_manager = Manager()
self.shared_process_pool = ProcessPool()
self.shared_thread_pool = ThreadPool()
self.shared_lock = Lock()
Ardından kodunuzda başka bir yerden güvenle içe aktarın
from globals import Globals
Globals().shared_manager
Globals().shared_process_pool
Globals().shared_thread_pool
Globals().shared_lock
pathos.multiprocessing
Burada daha genişletilmiş bir sarmalayıcı sınıfı yazdım :
Bir yan not olarak, eğer kullanım durumunuz bir performans optimizasyonu olarak sadece eşzamansız çoklu işlem haritası gerektiriyorsa, joblib arka planda tüm süreç havuzlarınızı yönetecek ve bu çok basit sözdizimine izin verecektir:
squares = Parallel(-1)( delayed(lambda num: num**2)(x) for x in range(100) )
I want a pool to be able to call a function that has another pool inside
bunun işçilerin daemonize edilmesine nasıl engel olduğunu anlamıyorum.