멀티프로세싱풀: map_async와 imap의 차이점은 무엇입니까?
Python multiprocessing패키지입니다만, 그 차이를 모르겠습니다.map_async ★★★★★★★★★★★★★★★★★」imap 다 눈에 map_async ★★★★★★★★★★★★★★★★★」imap는 비동기적으로 실행됩니다.그럼 언제 하나를 다른 것 위에 써야 할까요? 반환된 를 어떻게 하면 좋을까요?map_async
이런 거 쓸까요?
def test():
result = pool.map_async()
pool.close()
pool.join()
return result.get()
result=test()
for i in result:
print i
가지 가 있습니다.imap/imap_unordered ★★★★★★★★★★★★★★★★★」map/map_async:
- 당신이 그들에게 넘길 수 있는 것을 그들이 소비하는 방식.
- 그들이 당신에게 결과를 돌려주는 방식.
map는, 반복 한 것을 해, 「」의 「하는 것으로, 한 것을 소비합니다.Pool. 한 항목을 은 반복 한 각 에 한 한 항목씩 큰 ). 반복 가능한 항목을 청크로 분할하는 것은 반복 가능한 각 항목을 프로세스 간에 한 번에 한 항목씩 전달하는 것보다 성능이 우수합니다(특히 반복 가능한 항목이 큰 경우).그러나 목록 전체를 메모리에 보관해야 하므로 반복 가능 파일을 목록으로 변환하여 청크하면 메모리 비용이 매우 많이 들 수 있습니다.
imap를 지정해도 반복 가능한 목록이 되지 않으며, (기본값으로) 덩어리로 분할되지 않습니다.반복 가능한 요소를 한 번에 하나씩 반복하여 작업자 프로세스로 보냅니다.즉, 전체 반복 가능 항목을 목록으로 변환하는 데 따른 메모리 타격을 감수하지 않을 뿐만 아니라 청킹이 없기 때문에 대규모 반복 작업에 대한 성능 저하를 의미합니다.은, 「」를 할 수 .chunksize보다 큰 입니다.
큰 imap/imap_unordered ★★★★★★★★★★★★★★★★★」map/map_async 、 거 、 거 、 거 、 , , , , ,imap/imap_unordered모든 작업이 완료될 때까지 기다릴 필요 없이 작업자가 준비되는 대로 결과를 받을 수 있습니다.★★★★★★★★★★★★★★★★ map_async , , ,AsyncResult까지 실제로 수 이 는 같은 합니다.이 시점에서 이 개체는 다음과 같은 목록을 반환합니다.map 있다map는 실제로 으로 구현됩니다.map_async(...).get()부분적인 결과를 얻을 수 있는 방법은 없습니다.전체 결과가 나오거나 아무것도 나오지 않습니다.
imap ★★★★★★★★★★★★★★★★★」imap_unordered두 사람 모두 즉시 같은 것을 돌려줍니다.★★★★★★★★★★★★★★★★ imap, 입력 할 수 있는 수 ★★★★★★★★★★★★★★★★ imap_unordered경우 입력 결과가 나옵니다예를 들어 다음과 같습니다.
import multiprocessing
import time
def func(x):
time.sleep(x)
return x + 2
if __name__ == "__main__":
p = multiprocessing.Pool()
start = time.time()
for x in p.imap(func, [1,5,3]):
print("{} (Time elapsed: {}s)".format(x, int(time.time() - start)))
다음과 같이 출력됩니다.
3 (Time elapsed: 1s)
7 (Time elapsed: 5s)
5 (Time elapsed: 5s)
「 」를 사용하고 p.imap_unorderedp.imap뭇매를 맞다
3 (Time elapsed: 1s)
5 (Time elapsed: 3s)
7 (Time elapsed: 5s)
「 」를 사용하고 p.map ★★★★★★★★★★★★★★★★★」p.map_async().get()뭇매를 맞다
3 (Time elapsed: 5s)
7 (Time elapsed: 5s)
5 (Time elapsed: 5s)
'이유'를 사용하는 imap/imap_unordered에 걸쳐서map_async과 같습니다
- 반복 가능한 용량이 충분하므로 목록으로 변환하면 메모리가 부족하거나 너무 많이 사용됩니다.
- 모든 결과가 완료되기 전에 결과를 처리할 수 있어야 합니다.
은 '이렇게 하다'라고 .imap_unordered"완료되는 대로 결과가 반환될 것"이라고 추측할 수 있는 "완료된 순서대로 결과가 반환될 수 있습니다.하지만 나는 이것이 일반적으로 사실이 아니라는 것을 분명히 하고 싶다.문서에는 결과가 임의의 순서로 반환된다고 기재되어 있습니다.풀 크기 4, 반복 크기 20 및 청크 크기 값 5를 사용하는 다음 프로그램을 고려합니다.worker 함수는 전달된 인수에 따라 다양한 시간을 sleeve합니다.이것에 의해, 풀내의 어느 프로세스도 송신된 모든 작업을 취득하지 않게 됩니다.따라서 풀의 각 프로세스는20 / 4 = 5다음 중 하나:
from multiprocessing import Pool
import time
def worker(x):
print(f'x = {x}', flush=True)
time.sleep(.1 * (20 - x))
# return approximate completion time with passed argument:
return time.time(), x
if __name__ == '__main__':
pool = Pool(4)
results = pool.imap_unordered(worker, range(20), chunksize=5)
for t, x in results:
print('result:', t, x)
인쇄:
x = 0
x = 5
x = 10
x = 15
x = 16
x = 17
x = 11
x = 18
x = 19
x = 6
result: 1621512513.7737606 15
result: 1621512514.1747007 16
result: 1621512514.4758775 17
result: 1621512514.675989 18
result: 1621512514.7766125 19
x = 12
x = 1
x = 13
x = 7
x = 14
x = 2
result: 1621512514.2716103 10
result: 1621512515.1721854 11
result: 1621512515.9727488 12
result: 1621512516.6744206 13
result: 1621512517.276999 14
x = 8
x = 9
x = 3
result: 1621512514.7695887 5
result: 1621512516.170747 6
result: 1621512517.4713914 7
result: 1621512518.6734042 8
result: 1621512519.7743165 9
x = 4
result: 1621512515.268784 0
result: 1621512517.1698637 1
result: 1621512518.9698756 2
result: 1621512520.671273 3
result: 1621512522.2716706 4
이러한 결과가 완료 순서로 산출되지 않고 있는 것을 분명히 알 수 있습니다.를 들어, 적이 .1621512519.7743165 9에 어 followed가 붙는다.1621512515.268784 0이 값은 이전에 반환된 결과보다4초 이상 빨리 워커 함수에 의해 반환되었습니다.단, 청크기 값을 1로 변경하면 다음과 같이 출력됩니다.
x = 0
x = 1
x = 2
x = 3
x = 4
result: 1621513028.888357 3
x = 5
result: 1621513028.9863524 2
x = 6
result: 1621513029.0838938 1
x = 7
result: 1621513029.1825204 0
x = 8
result: 1621513030.4842813 7
x = 9
result: 1621513030.4852195 6
x = 10
result: 1621513030.4872172 5
x = 11
result: 1621513030.4892178 4
x = 12
result: 1621513031.3908074 11
x = 13
result: 1621513031.4895358 10
x = 14
result: 1621513031.587289 9
x = 15
result: 1621513031.686152 8
x = 16
result: 1621513032.1877549 15
x = 17
result: 1621513032.1896958 14
x = 18
result: 1621513032.1923752 13
x = 19
result: 1621513032.1923752 12
result: 1621513032.2935638 19
result: 1621513032.3927407 18
result: 1621513032.4912949 17
result: 1621513032.5884912 16
이것은 완료 순서입니다.하지만, 저는 그것을 말하는 것을 주저합니다.imap_unordered 는 청크즈 값 1을 지정하면 결과가 항상 반환됩니다.다만, 이 실험에 근거하고 있는 것은, 문서에서는 이러한 주장이 없기 때문입니다.
논의
5의 청크기를 지정하면 풀의 4개 프로세스가 5의 청크로 처리될 수 있도록 20개의 작업이 단일 입력 큐에 배치됩니다.따라서 아이돌 상태가 된 프로세스는 큐에서 다음 5개의 태스크 청크를 해제하고 각 태스크를 차례로 처리한 후 다시 아이돌 상태가 됩니다.따라서 첫 번째 프로세스는 처리입니다.x0 ~, 두 프로세스 "0 ~ 4, " " "x 앞부분은 '5~9'로 있어요.x0, 5, 10, 15면 됩니다.
지만 for for x 완성됩니다.x인수는 , 따라서 , 9번, 9번, 9번, 9번, 9번, , 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 9번, 3번, 9번, 9번, 3번, 3번, 3번, 3번x는 0 인수의 가 나올 .x같은 청크에 큐잉된 인수(1, 2, 3, 4 등)도 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/26520781/multiprocessing-pool-whats-the-difference-between-map-async-and-imap
'source' 카테고리의 다른 글
| Wordpress 검색 결과를 표시하는 방법 (0) | 2023.02.07 |
|---|---|
| 문자열 출력에서 캐리지 리턴을 제거하려면 어떻게 해야 합니까? (0) | 2023.02.07 |
| npm은 패키지를 어디에 설치합니까? (0) | 2023.02.04 |
| SciPy와 NumPy의 관계 (0) | 2023.02.04 |
| 테이블 정보 없이 mysqldump를 사용하여 데이터만 덤프하시겠습니까? (0) | 2023.02.04 |