Programing

다중 처리풀: 적용 시기, 적용_async 또는 맵?

c10106 2022. 4. 1. 19:23
반응형

다중 처리풀: 적용 시기, 적용_async 또는 맵?

Pool.appy, Pool.appy_asyncPool.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.applyPool.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.applyPool.map전체 결과가 반환될 때까지 블럭화.

작업자 풀 프로세스가 많은 함수 호출을 비동기적으로 수행하도록 하려면 다음을 사용하십시오.Pool.apply_async. 결과의 순서는 통화의 순서와 같게 보장되지 않는다.Pool.apply_async.

또한 다음 기능을 사용하여 여러 가지 기능을 호출할 수 있다는 점에 유의하십시오.Pool.apply_async(모든 통화가 동일한 기능을 사용할 필요는 없음).

그에 반해서Pool.map많은 논쟁에 같은 기능을 적용한다.하지만, 달리Pool.apply_async

다음은 테이블 형식의 개요로, 각 테이블의 차이점을 보여준다.Pool.applyPool.apply_asyncPool.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.starmapmethod, 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를 참조하십시오.

에 관하여applymap:

pool.apply(f, args):f풀의 작업자 중 한 명에서만 실행된다.풀의 프로세스 중 하나가 실행됨f(args).

pool.map(f, iterable): 이 방법은 공정 풀에 별도의 작업으로 제출하는 여러 청크로 반복한다.그러니까 풀의 모든 프로세스를 활용하십시오.

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

반응형