2014-12-29 7 views
2

가끔 인수없이 함수에 다중 처리를 사용해야합니다. 나는 같은 것을 할 수 있으면 좋겠다 : 나는 Process(target=f, args=()) 할 수map/imap/imap_unordered를 인자없이 함수와 함께 사용할 수 있습니까?

from multiprocessing import Pool 

def f(): # no argument 
    return 1 

# TypeError: f() takes no arguments (1 given) 
print Pool(2).map(f, range(10)) 

을,하지만 난 map/imap/imap_unordered의 구문을 선호합니다. 그렇게 할 수있는 방법이 있습니까?

+0

하나의 인수를 무시하고 무시하기 위해'f'를 재정의 하시겠습니까? – inspectorG4dget

+1

@ inspectorG4dget : 아니요, 차라리 피하려고합니다. –

+1

이것이 [XY 문제]라고 생각합니다. (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). 이제 한 걸음 뒤로 물러나보십시오. 실제로이 기능을 사용하려고 시도하고있는 것은 무엇입니까? – inspectorG4dget

답변

3

map 함수의 첫 번째 인수는 함수 여야하며 하나의 인수를 받아 들여야합니다. 두 번째 인수로 전달 된 iterable이 반복되고 값이 각 반복에서 하나씩 함수에 전달되므로 필수적입니다.

그래서, 당신의 최선의 방법이

from multiprocessing import Pool 

def f(): # no argument 
    return 1 

def throw_away_function(_): 
    return f() 

print(Pool(2).map(throw_away_function, range(10))) 
# [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 

처럼, f의 반환 값을 하나 개의 인자를 받아들이고 그것을 무시하거나 하나 개의 인자를 가진 래퍼 함수를 ​​작성, 인수를 무시하고 반환 f을 다시 정의하는 것입니다 선택 가능하지 않기 때문에 풀과 함께 lamdba 기능을 사용할 수 없습니다.

0

Pool.apply_async을 사용하는데 문제가 있습니까?

with multiprocessing.Pool() as pool: 
    future_results = [pool.apply_async(f) for i in range(n)] 
    results = [f.get() for f in future_results] 
+0

그러면 오류가 발생합니다 (Python 2.7) : 다중 처리로 .Pool() 풀로 : AttributeError : __exit__ – postoronnim