Programing

풀 : apply, apply_async 또는 map을 언제 사용합니까?

lottogame 2020. 4. 5. 19:51
반응형

풀 : apply, apply_async 또는 map을 언제 사용합니까?


Pool.apply , Pool.apply_asyncPool.map에 대한 유스 케이스가있는 명확한 예제를 보지 못했습니다 . 나는 주로 사용하고 있습니다 Pool.map; 다른 사람들의 장점은 무엇입니까?


옛날 파이썬에서 임의의 인수로 함수를 호출하려면 다음을 사용하십시오 apply.

apply(f,args,kwargs)

applyPython3에는 없지만 Python2.7에는 여전히 존재하며 일반적으로 더 이상 사용되지 않습니다. 요즘,

f(*args,**kwargs)

선호됩니다. multiprocessing.Pool모듈은 유사한 인터페이스를 제공하려고합니다.

Pool.applyapply함수 호출이 별도의 프로세스에서 수행된다는 점을 제외하고 는 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인수의 순서에 따라 결과가 반환됩니다.


applyvs에 관해서 map:

pool.apply(f, args): f풀의 작업자 중 하나에서만 실행됩니다. 따라서 풀의 프로세스 중 하나가 실행 f(args)됩니다.

pool.map(f, iterable):이 메소드는 iterable을 여러 청크로 분할하여 별도의 태스크로 프로세스 풀에 제출합니다. 따라서 풀의 모든 프로세스를 활용하십시오.

참고 URL : https://stackoverflow.com/questions/8533318/multiprocessing-pool-when-to-use-apply-apply-async-or-map

반응형