2009-04-11 39 views
5

Tôi đang phân lớp lớp Quy trình thành một lớp tôi gọi là EdgeRenderer. Tôi muốn sử dụng multiprocessing.Pool, ngoại trừ thay vì Quy trình thông thường, tôi muốn chúng là các phiên bản của EdgeRenderer của tôi. Khả thi? Làm sao?Đa xử lý Python: Nhóm các quy trình tùy chỉnh

+0

bạn đang cố gắng để viết mã của bạn để sử dụng đa luồng bằng cách này ? –

+0

Đa xử lý. –

Trả lời

3

Từ Jesse Noller:

Nó hiện không được hỗ trợ trong API, nhưng sẽ không phải là một xấu thêm vào. tôi sẽ xem xét thêm nó vào python2.7/2.6.3 3.1 trong tuần này

2

Tôi không thấy bất kỳ móc nào trong API. Bạn có thể thoát khỏi việc sao chép chức năng mong muốn của mình bằng cách sử dụng đối số initializerinitargs. Cách khác, bạn có thể xây dựng các chức năng vào đối tượng có thể được gọi mà bạn sử dụng để lập bản đồ:

class EdgeRenderTask(object): 
    def op1(self,*args): 
     ... 
    def op2(self,*args): 
     ... 
p = Pool(processes = 10) 
e = EdgeRenderTask() 
p.apply_async(e.op1,arg_list) 
p.map(e.op2,arg_list) 
+0

Bạn không thể chuyển một lớp làm đối số cho 'p.map', bạn sẽ gặp phải lỗi pickle. Cách duy nhất tôi tìm thấy xung quanh việc này là triển khai một loại 'pool.map' tùy chỉnh .... tự thiết lập và tự cung cấp các quy trình. Thật không may nó sẽ mất nhiều dòng hơn. – catwalker333

2

Điều này dường như làm việc:

import multiprocessing as mp 

ctx = mp.get_context() # get the default context 

class MyProcess(ctx.Process): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     print("Hi, I'm custom a process") 

ctx.Process = MyProcess # override the context's Process 

def worker(x): 
    print(x**2) 

p = ctx.Pool(4) 
nums = range(10) 
p.map(worker, nums) 
Các vấn đề liên quan