풀 : apply, apply_async 또는 map을 언제 사용합니까?
Pool.apply , Pool.apply_async 및 Pool.map에 대한 유스 케이스가있는 명확한 예제를 보지 못했습니다 . 나는 주로 사용하고 있습니다 Pool.map
; 다른 사람들의 장점은 무엇입니까?
옛날 파이썬에서 임의의 인수로 함수를 호출하려면 다음을 사용하십시오 apply
.
apply(f,args,kwargs)
apply
Python3에는 없지만 Python2.7에는 여전히 존재하며 일반적으로 더 이상 사용되지 않습니다. 요즘,
f(*args,**kwargs)
선호됩니다. multiprocessing.Pool
모듈은 유사한 인터페이스를 제공하려고합니다.
Pool.apply
apply
함수 호출이 별도의 프로세스에서 수행된다는 점을 제외하고 는 Python과 같습니다 . Pool.apply
기능이 완료 될 때까지 차단합니다.
Pool.apply_async
또한 apply
결과를 기다리지 않고 호출이 즉시 반환된다는 점을 제외하면 Python의 내장 기능과 같습니다 . AsyncResult
객체가 돌려 주어집니다. get()
함수 호출 결과를 검색하기 위해 해당 메소드를 호출합니다. get()
기능까지있어서 블록이 완료된다. 따라서와 pool.apply(func, args, kwargs)
같습니다 pool.apply_async(func, args, kwargs).get()
.
반대로 Pool.apply
, Pool.apply_async
메소드에는 함수가 완료 될 때 호출되는 콜백도 있습니다. 호출하는 대신 사용할 수 있습니다 get()
.
예를 들면 다음과 같습니다.
import multiprocessing as mp
import time
def foo_pool(x):
time.sleep(2)
return x*x
result_list = []
def log_result(result):
# This is called whenever foo_pool(i) returns a result.
# result_list is modified only by the main process, not the pool workers.
result_list.append(result)
def apply_async_with_callback():
pool = mp.Pool()
for i in range(10):
pool.apply_async(foo_pool, args = (i, ), callback = log_result)
pool.close()
pool.join()
print(result_list)
if __name__ == '__main__':
apply_async_with_callback()
다음과 같은 결과를 얻을 수 있습니다
[1, 0, 4, 9, 25, 16, 49, 36, 81, 64]
와 달리 pool.map
결과 순서는 pool.apply_async
호출 한 순서와 일치하지 않을 수 있습니다 .
따라서 별도의 프로세스에서 함수를 실행해야하지만 해당 함수가 리턴 될 때까지 현재 프로세스를 차단 하려면을 사용하십시오 Pool.apply
. 마찬가지로 Pool.apply
, Pool.map
전체 결과까지 블록이 반환됩니다.
작업자 프로세스 풀이 많은 함수 호출을 비동기 적으로 수행하도록하려면을 사용하십시오 Pool.apply_async
. 위해 결과는에 대한 호출의 순서와 동일하게 보장 할 수 없습니다 Pool.apply_async
.
또한 여러 다른 함수 Pool.apply_async
를 사용하여 호출 할 수 있습니다 (모든 호출이 동일한 함수를 사용할 필요는 없음).
반대로, Pool.map
동일한 함수를 여러 인수에 적용합니다. 그러나와 달리 Pool.apply_async
인수의 순서에 따라 결과가 반환됩니다.
apply
vs에 관해서 map
:
pool.apply(f, args)
: f
풀의 작업자 중 하나에서만 실행됩니다. 따라서 풀의 프로세스 중 하나가 실행 f(args)
됩니다.
pool.map(f, iterable)
:이 메소드는 iterable을 여러 청크로 분할하여 별도의 태스크로 프로세스 풀에 제출합니다. 따라서 풀의 모든 프로세스를 활용하십시오.
'Programing' 카테고리의 다른 글
SortedList와 SortedDictionary의 차이점은 무엇입니까? (0) | 2020.04.05 |
---|---|
파이썬 들여 쓰기를 수정하는 방법 (0) | 2020.04.05 |
전체 Android 앱에 기본 글꼴 모음을 설정하는 방법 (0) | 2020.04.05 |
힘내 체크 아웃 의미 더블 대시 (0) | 2020.04.05 |
환경이 수정 된 Python 하위 프로세스 / Popen (0) | 2020.04.05 |