2013-01-22 12 views
6

Xin chào.Truyền chức năng chấp nhận các chức năng của thành viên lớp như các biến vào pool pool đa bội python()

Đây là mã tôi có vào lúc này:

def f(tup): 
    return some_complex_function(*tup) 

def main(): 

    pool = Pool(processes=4) 
    #import and process data omitted 
    _args = [(x.some_func1, .05, x.some_func2) for x in list_of_some_class] 
    results = pool.map(f, _args) 
    print results 

Các lỗi đầu tiên tôi nhận được là:

> Exception in thread Thread-2: Traceback (most recent call last): 
> File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner 
>  self.run() File "/usr/lib/python2.7/threading.py", line 504, in run 
>  self.__target(*self.__args, **self.__kwargs) File "/usr/lib/python2.7/multiprocessing/pool.py", line 319, in 
> _handle_tasks 
>  put(task) PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed 

Bất kỳ trợ giúp sẽ rất cảm kích.

Trả lời

8

Mô-đun multiprocess sử dụng mô-đun pickle để tuần tự hóa các đối số được chuyển đến hàm (f), được thực hiện trong một quy trình khác.

Nhiều loại được tích hợp sẵn có thể được chọn, nhưng không thể chọn phương pháp mẫu. Vì vậy, .05 là tốt, nhưng x.some_func1 thì không. Xem What can be pickled and unpickled? để biết thêm chi tiết.

Không có giải pháp đơn giản nào. Bạn sẽ cần phải cấu trúc lại chương trình của bạn để các phương thức thể hiện không cần phải được chuyển làm đối số (hoặc tránh sử dụng multiprocess).

+0

Cảm ơn bạn đã đề xuất và tái cơ cấu – ast4

3

Nếu bạn sử dụng một cái nĩa của multiprocessing được gọi là pathos.multiprocesssing, bạn có thể trực tiếp sử dụng các lớp và phương pháp lớp trong các chức năng map của bộ xử lý đa. Điều này là do dill được sử dụng thay vì pickle hoặc cPickledill có thể tuần tự hóa hầu hết mọi thứ trong python.

pathos.multiprocessing cũng cung cấp một chức năng bản đồ không đồng bộ ... và nó có thể map chức năng với nhiều đối số (ví dụ map(math.pow, [1,2,3], [4,5,6]))

Xem: What can multiprocessing and dill do together?

và: http://matthewrocklin.com/blog/work/2013/12/05/Parallelism-and-Serialization/

>>> from pathos.multiprocessing import ProcessingPool as Pool 
>>> 
>>> p = Pool(4) 
>>> 
>>> def add(x,y): 
... return x+y 
... 
>>> x = [0,1,2,3] 
>>> y = [4,5,6,7] 
>>> 
>>> p.map(add, x, y) 
[4, 6, 8, 10] 
>>> 
>>> class Test(object): 
... def plus(self, x, y): 
...  return x+y 
... 
>>> t = Test() 
>>> 
>>> p.map(Test.plus, [t]*4, x, y) 
[4, 6, 8, 10] 
>>> 
>>> p.map(t.plus, x, y) 
[4, 6, 8, 10] 

Lấy mã tại đây: https://github.com/uqfoundation/pathos

Các vấn đề liên quan