2

pathos.multiprocessing을 사용하여 인스턴스 메서드를 사용해야하는 프로그램을 병렬 처리합니다. 여기에 최소한의 작업 예입니다키워드 목록을 pathos.multiprocessing에 전달하는 방법은 무엇입니까?

import time 
import numpy as np 
from pathos.multiprocessing import Pool, ProcessingPool, ThreadingPool 

class dummy(object): 
    def __init__(self, arg, key1=None, key2=-11): 

     np.random.seed(arg) 

     randnum = np.random.randint(0, 5) 

     print 'Sleeping {} seconds'.format(randnum) 
     time.sleep(randnum) 

     self.value = arg 
     self.more1 = key1 
     self.more2 = key2 

args = [0, 10, 20, 33, 82] 
keys = ['key1', 'key2'] 
k1val = ['car', 'borg', 'syria', 'aurora', 'libera'] 
k2val = ['a', 'b', 'c', 'd', 'e'] 
allks = [dict(zip(keys, [k1val[i], k2val[i]])) for i in range(5)] 

pool = ThreadingPool(4) 
result = pool.map(dummy, args, k1val, k2val) 

print [[r.value, r.more1, r.more2] for r in result] 

인쇄 된 결과 (예상대로)입니다 :

Sleeping 4 seconds 
Sleeping 1 seconds 
Sleeping 3 seconds 
Sleeping 4 seconds 
Sleeping 3 seconds 
[[0, 'car', 'a'], [10, 'borg', 'b'], [20, 'syria', 'c'], [33, 'aurora', 'd'], [82, 'libera', 'e']] 

그러나 map이 호출 마지막 두 인수 문제의 순서로, 그리고 내가 할 경우 :

result2 = pool.map(dummy, args, k2val, k1val) 

I 입수 :

[[0, 'a', 'car'], [10, 'b', 'borg'], [20, 'c', 'syria'], [33, 'd', 'aurora'], [82, 'e', 'libera']] 

나는 첫 번째 결과와 같은 것을 얻고 싶습니다. 이 동작은 표준 모듈 multiprocessing에서 apply_asynckwds이 수행 할 수있는 것과 동일합니다. 즉, 사전 목록을 전달합니다. 각 사전에서 키는 키워드 이름이고 항목은 키워드 인수입니다 (allks 참조). 표준 모듈 multiprocessing은 인스턴스 메서드를 사용할 수 없으므로 최소 요구 사항조차 충족시키지 않습니다.

잠정적이 될 것이다 : 결과 = pool.map (더미, 인수, kwds = allks) #이 내가 pathos 저자 해요

답변

3

작동하지 않습니다. 그래, 내가 알기 론 뭔가 작은 일이 필요해. 현재 ProcessPool, ThreadPoolParallelPool에서 mappipe (즉 apply) 방법은 kwds을받을 수 없어 - 당신은 args로를 통과해야합니다. 그러나 _ProcessPool 또는 _ThreadPool을 사용하는 경우 mapapply 방법에 kwds을 전달할 수 있습니다. pathos.pools의 밑줄로 시작하는 풀은 실제로 multiprocess에서 직접 가져온 것이므로 multiprocessing에있는 API와 동일한 API를 사용합니다 (그러나 더 나은 직렬화로 클래스 메서드 등을 전달할 수 있음).

>>> from pathos.pools import _ProcessPool 
>>> from multiprocess.pool import Pool 
>>> Pool is _ProcessPool 
True 

그래서, (영업의 제안 편집에서 )과 같이 보일 것입니다 원래의 코드 편집에 대한 :

>>> from pathos.pools import _ThreadPool 
>>> pool = _ThreadPool(4) 
>>> 
[…] 
>>> result = [] 
>>> def callback(x): 
>>> result.append(x) 
>>> 
>>> for a, k in zip(args, allks): 
>>>  pool.apply_async(dummy, args=(a,), kwds=k, callback=callback) 
>>> 
>>> pool.close() 
>>> pool.join() 
+0

는 진심이 대형 개발에 시간과 노력을 넣어 주셔서 감사합니다' pathos'. 내 특정 문제를 해결하기위한 추가적인 명성. – astabada

관련 문제