다중 처리풀: 적용 시기, 적용_async 또는 맵?
Pool.appy, Pool.appy_async 및 Pool.map에 대한 사용 사례가 포함된 명확한 예제를 본 적이 없다.나는 주로 사용하고 있다.Pool.map
; 다른 사람들의 장점은 무엇인가?
옛날 파이썬에서는 임의의 인수로 함수를 부르기 위해apply
:
apply(f,args,kwargs)
apply
파이톤2.7에는 있지만 Python2.7에는 여전히 존재하며, 일반적으로 더 이상 사용되지 않는다.요즘 들어
f(*args,**kwargs)
선호된다.그multiprocessing.Pool
모듈들은 유사한 인터페이스를 제공하려고 노력한다.
Pool.apply
파이톤과 같다apply
함수 호출은 별도의 프로세스에서 수행된다는 점을 제외한다.Pool.apply
기능이 완료될 때까지 블럭화하십시오.
Pool.apply_async
파이썬의 내장형과도 같다.apply
, 결과를 기다리는 대신 즉시 통화가 돌아온다는 점을 제외한다.안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
. like.Pool.apply
Pool.map
전체 결과가 반환될 때까지 블럭화.
작업자 풀 프로세스가 많은 함수 호출을 비동기적으로 수행하도록 하려면 다음을 사용하십시오.Pool.apply_async
. 결과의 순서는 통화의 순서와 같게 보장되지 않는다.Pool.apply_async
.
또한 다음 기능을 사용하여 여러 가지 기능을 호출할 수 있다는 점에 유의하십시오.Pool.apply_async
(모든 통화가 동일한 기능을 사용할 필요는 없음).
그에 반해서Pool.map
많은 논쟁에 같은 기능을 적용한다.하지만, 달리Pool.apply_async
다음은 테이블 형식의 개요로, 각 테이블의 차이점을 보여준다.Pool.apply
Pool.apply_async
Pool.map
그리고Pool.map_async
등을 하나를 선택할 때는 멀티아그, 동시성, 차단, 주문 등을 고려해야 한다.
| Multi-args Concurrence Blocking Ordered-results
---------------------------------------------------------------------
Pool.map | no yes yes yes
Pool.map_async | no yes no yes
Pool.apply | yes no yes no
Pool.apply_async | yes yes no no
Pool.starmap | yes yes yes yes
Pool.starmap_async| yes yes no no
주의:
Pool.imap
그리고Pool.imap_async
– 맵 및 맵_vmsc의 더 느린 버전.Pool.starmap
method, map method와 매우 유사하며, method는 복수의 인수를 수용한다.Async
메소드는 모든 프로세스를 한 번에 제출하고, 작업이 완료되면 결과를 검색한다.get 메소드를 사용하여 결과를 얻으십시오.Pool.map
(또는)Pool.apply
지도(와방법(methods)은 Python 내장 지도(또는 적용)와 매우 유사하다.그들은 모든 프로세스가 완료될 때까지 주요 프로세스를 차단하고 결과를 반환한다.
예:
지도를 그리다
한 번에 작업 목록을 호출함
results = pool.map(func, [1, 2, 3])
신청하다
한 개의 작업만 호출할 수 있음
for x, y in [[1, 1], [2, 2]]:
results.append(pool.apply(func, (x, y)))
def collect_result(result):
results.append(result)
map_mapc
한 번에 작업 목록을 호출함
pool.map_async(func, jobs, callback=collect_result)
apply_vmsc
한 개의 작업만 호출할 수 있고 백그라운드에서 작업을 병렬로 실행할 수 있음
for x, y in [[1, 1], [2, 2]]:
pool.apply_async(worker, (x, y), callback=collect_result)
별맵
의 변종인가?pool.map
여러 주장을 뒷받침하는 것
pool.starmap(func, [(1, 1), (2, 1), (3, 1)])
starmap_properc
스타맵()과 map_async()의 조합으로, 반복할 수 없는 반복 가능한 반복 가능에 대해 반복하고 반복할 수 없는 반복 가능이 풀린 상태에서 func를 호출한다.결과 개체를 반환한다.
pool.starmap_async(calculate_worker, [(1, 1), (2, 1), (3, 1)], callback=collect_result)
참조:
자세한 내용은 https://docs.python.org/3/library/multiprocessing.html를 참조하십시오.
에 관하여apply
대map
:
pool.apply(f, args)
:f
풀의 작업자 중 한 명에서만 실행된다.풀의 프로세스 중 하나가 실행됨f(args)
.
pool.map(f, iterable)
: 이 방법은 공정 풀에 별도의 작업으로 제출하는 여러 청크로 반복한다.그러니까 풀의 모든 프로세스를 활용하십시오.
'Programing' 카테고리의 다른 글
형식:변수를 내보내는 방법 (0) | 2022.04.01 |
---|---|
브라우저를 사용하여 비동기/게을 로드 Vue 구성 요소 (0) | 2022.04.01 |
파이톤 3의 로_input()과 인풋()의 차이점은 무엇일까. (0) | 2022.04.01 |
반응 저감을 통한 지리 위치 (0) | 2022.04.01 |
Python 3 ImportError: 'ConfigParser'라는 이름의 모듈 없음 (0) | 2022.04.01 |