스택큐힙리스트

multiprocessing.Pool: apply, apply_async, 또는 map을 사용해야 할 때는 언제입니까? 본문

카테고리 없음

multiprocessing.Pool: apply, apply_async, 또는 map을 사용해야 할 때는 언제입니까?

스택큐힙리스트 2023. 4. 16. 05:46
반응형

나는 Pool.apply, Pool.apply_async 및 Pool.map에 대한 사용 사례와 명확한 예제를 보지 못했습니다. 나는 주로 Pool.map를 사용하고 있습니다. 다른 것들의 장점은 무엇인가요?

답변 1

옛날 파이썬에서 임의의 인자와 함께 함수를 호출하려면 apply를 사용했습니다.

apply(f,args,kwargs)

apply은 Python3에서는 더 이상 사용되지 않지만, 여전히 Python2.7에서 존재하며 일반적으로 사용되지 않습니다. 최근에는 ~합니다.

f(*args,**kwargs)

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

Pool.apply는 Python과 비슷하지만 함수 호출이 별도의 프로세스에서 수행된다는 점이 다릅니다. Pool.apply은 함수가 완료될 때까지 블록됩니다.

Pool.apply_async 는 Python의 내장 apply 와 유사하지만 결과를 기다리지 않고 즉시 반환합니다. AsyncResult 객체가 반환됩니다. 함수 호출의 결과를 검색하려면 get() 메서드를 호출하면 됩니다. get() 메서드는 함수가 완료될 때까지 블록됩니다. 따라서 pool.apply(func, args, kwargs) 는 pool.apply_async(func, args, kwargs).get() 와 동등합니다.

Pool.apply에 대조적으로, Pool.apply_async 방법에는 함수가 완료될 때 호출되는 콜백(callback)도 포함되어 있습니다. 이것은 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의 호출 순서와 일치하지 않을 수 있습니다.

그러니까, 별도의 프로세스에서 함수를 실행해야하지만 현재 프로세스가 그 함수가 반환 될 때까지 block 해야하는 경우 Pool.apply 를 사용하십시오. Pool.apply 와 같이 Pool.map 도 전체 결과가 반환 될 때까지 block합니다.

만약 작업자 프로세스 풀이 많은 함수 호출을 비동기적으로 수행하길 원한다면, Pool.apply_async를 사용하세요. 결과의 순서는 Pool.apply_async에 대한 호출 순서와 일치하지 않을 수 있습니다.

또한 Pool.apply_async 를 사용하여 여러가지 다른 함수를 호출할 수 있다는 것도 주목하라. (모든 호출이 동일한 함수를 사용할 필요는 없음)

대조적으로, Pool.map은 많은 인수에 동일한 기능을 적용합니다. 그러나 Pool.apply_async와는 달리 결과는 인수의 순서에 해당하는 순서로 반환됩니다.

답변 2

멀티프로세싱.Pool: apply, apply_async 또는 map을 언제 사용해야 할까?

Python에서 멀티프로세싱을 사용하면 CPU를 효율적으로 이용할 수 있습니다. multiprocessing.Pool을 사용하여 멀티프로세싱을 실행하는 방법 중 세 가지 함수가 있습니다. 이 함수들은 apply, apply_async, map입니다. 그러나 이 함수들은 언제 사용해야 하는지 알 필요가 있습니다.

apply 함수는 하나의 프로세스에서 함수를 실행하고 결과를 반환합니다. 이 함수는 다른 함수와 결과를 공유하지 않으므로 매우 안전합니다. 그러나 동기적인 방법으로 작동하기 때문에 다른 작업을 수행할 수 없습니다. 이 함수는 작업이 완료될 때까지 대기해야 하므로 작업시간이 길어질수록 성능이 저하됩니다.

apply_async 함수는 비동기적인 방법으로 작동합니다. 이 함수는 프로세스를 생성하여 작업을 수행합니다. 이 함수는 비동기적으로 작동하기 때문에 다른 작업을 실행해야 할 때 유용합니다. 이 함수는 또한 callback 인수를 사용하여 작업이 완료되면 함수를 호출합니다.

map 함수는 리스트, 튜플 또는 이터레이터를 input으로 받아 각 요소별로 함수를 실행하고 결과를 리스트로 반환합니다. 이 함수는 간단하고 쉽게 사용할 수 있습니다. 그러나 결과를 반환 할 때까지 대기하므로 apply 함수와 동일한 문제를 가지고 있습니다.

따라서 apply 함수는 작업이 빠르고 안전하게 수행되는 경우 사용됩니다. apply_async 함수는 비동기적으로 작업을 수행하는 경우 사용됩니다. map 함수는 작업 결과를 리스트로 반환해야 하는 경우 사용됩니다.

종합적으로, 이 세 가지 함수는 모두 특정한 상황에서 유용합니다. apply, apply_async, map은 모두 멀티프로세싱.Pool에서 작업을 실행하는 방법에 있어 다양한 장단점이 있습니다. 따라서 프로젝트의 요구사항에 따라 적절한 함수를 선택해야 합니다.

반응형
Comments