Khi tôi chạy một cái gì đó như:
from multiprocessing import Pool
p = Pool(5)
def f(x):
return x*x
p.map(f, [1,2,3])
nó hoạt động tốt. Tuy nhiên, đặt điều này như là một chức năng của một lớp:
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()
Cung cấp cho tôi các lỗi sau:
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
Tôi đã thấy một bài đăng từ Alex Martelli xử lý cùng loại vấn đề, nhưng nó không đủ rõ ràng.
IPython.Parallel
, nhưng ở đó bạn có thể khắc phục vấn đề bằng cách đẩy các đối tượng đến các nút. Có vẻ khá khó chịu khi giải quyết vấn đề này với đa xử lý.
calculate
là picklable, vì vậy nó có vẻ như điều này có thể được giải quyết bằng 1) tạo ra một đối tượng hàm với một constructor rằng bản sao trên một calculate
ví dụ và sau đó 2) đi qua một thể hiện của đối tượng chức năng này để Pool
's map
phương pháp. Không?
multiprocessing
mô-đun là do mục tiêu của nó là triển khai đa nền tảng và thiếu fork(2)
cuộc gọi hệ thống giống như trong Windows. Nếu bạn không quan tâm đến hỗ trợ Win32, có thể có một cách giải quyết dựa trên quy trình đơn giản hơn. Hoặc nếu bạn chuẩn bị sử dụng các luồng thay vì các quy trình, bạn có thể thay thế from multiprocessing import Pool
bằng from multiprocessing.pool import ThreadPool as Pool
.