Ketika saya menjalankan sesuatu seperti:
from multiprocessing import Pool
p = Pool(5)
def f(x):
return x*x
p.map(f, [1,2,3])
ini bekerja dengan baik. Namun, menempatkan ini sebagai fungsi kelas:
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()
Memberi saya kesalahan berikut:
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
Saya telah melihat posting dari Alex Martelli berurusan dengan masalah yang sama, tetapi itu tidak cukup eksplisit.
IPython.Parallel
, tetapi di sana Anda bisa menyelesaikan masalah dengan mendorong benda ke node. Tampaknya cukup menjengkelkan untuk menyelesaikan masalah ini dengan multiprosesor.
calculate
adalah picklable, sehingga tampaknya seperti ini dapat diselesaikan dengan 1) menciptakan fungsi objek dengan konstruktor yang salinan atas calculate
contoh dan kemudian 2) melewati sebuah instance dari objek fungsi ini untuk Pool
's map
metode. Tidak?
multiprocessing
modul adalah karena tujuannya untuk menjadi implementasi lintas platform, dan kurangnya fork(2)
panggilan sistem seperti pada Windows. Jika Anda tidak peduli dengan dukungan Win32, mungkin ada solusi berbasis proses yang lebih sederhana. Atau jika Anda siap untuk menggunakan benang bukan proses, Anda dapat mengganti from multiprocessing import Pool
dengan from multiprocessing.pool import ThreadPool as Pool
.