Ne zaman bir şey çalıştırmak:
from multiprocessing import Pool
p = Pool(5)
def f(x):
return x*x
p.map(f, [1,2,3])
iyi çalışıyor. Ancak, bunu bir sınıfın işlevi olarak koymak:
class calculate(object):
def run(self):
def f(x):
return x*x
p = Pool()
return p.map(f, [1,2,3])
cl = calculate()
print cl.run()
Bana şu hatayı verir:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/sw/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/sw/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/sw/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Alex Martelli'den de aynı tür bir sorunla uğraşan bir gönderi gördüm, ama yeterince açık değildi.
IPython.Parallel
, ama nesneleri düğümlere iterek sorunu çözebilirsiniz. Çok işlemeyle bu sorunun üstesinden gelmek oldukça can sıkıcı görünüyor.
calculate
bu kopyalar üzerinde olduğu, bir yapılandırıcı ile, bir işlev nesnesini oluşturmak: 1) çözülebilir Bu gibi görünüyor, bu yüzden picklable olan calculate
2 örneği ve daha sonra), bu işlev nesnesinin bir örneğini geçen Pool
'in map
yöntemi. Hayır?
multiprocessing
Modülün bazı sınırlamaları, platformlar arası bir uygulama olma hedefinden ve fork(2)
Windows'ta benzer bir sistem çağrısının olmamasından kaynaklanmaktadır . Win32 desteği ile ilgilenmiyorsanız, daha basit bir işlem tabanlı geçici çözüm olabilir. Yerine süreçlerin konuları kullanmaya hazır eğer Veya, yerini alabilir from multiprocessing import Pool
ile from multiprocessing.pool import ThreadPool as Pool
.