일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 컴퓨터비전
- 코딩
- 빅데이터
- 웹개발
- 자바스크립트
- 자료구조
- Yes
- 컴퓨터공학
- 사이버보안
- I'm Sorry
- 파이썬
- 2
- 컴퓨터과학
- 데이터분석
- 네트워크보안
- 프로그래밍언어
- 인공지능
- 알고리즘
- 프로그래밍
- 보안
- 머신러닝
- 버전관리
- 데이터과학
- 클라우드컴퓨팅
- 데이터베이스
- 네트워크
- 딥러닝
- 데이터구조
- 소프트웨어
- 소프트웨어공학
- Today
- Total
스택큐힙리스트
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에서 작업을 실행하는 방법에 있어 다양한 장단점이 있습니다. 따라서 프로젝트의 요구사항에 따라 적절한 함수를 선택해야 합니다.