다중 처리 : tqdm을 사용하여 진행률 표시 줄 표시
내 코드를보다 "pythonic"하고 빠르게 만들기 위해 "multiprocessing"과 맵 함수를 사용하여 a) 함수 및 b) 반복 범위를 보냅니다.
이식 된 솔루션 (즉, tqdm.tqdm (range (0, 30)) 범위에서 직접 tqdm 호출)은 다중 처리 (아래 코드에서 공식화 됨)에서 작동하지 않습니다.
진행률 표시 줄은 0 ~ 100 % (파이썬이 코드를 읽을 때?)로 표시되지만지도 기능의 실제 진행률을 나타내지는 않습니다.
'지도'기능이 어느 단계에 있는지 나타내는 진행률 표시 줄을 표시하는 방법은 무엇입니까?
from multiprocessing import Pool
import tqdm
import time
def _foo(my_number):
square = my_number * my_number
time.sleep(1)
return square
if __name__ == '__main__':
p = Pool(2)
r = p.map(_foo, tqdm.tqdm(range(0, 30)))
p.close()
p.join()
모든 도움이나 제안을 환영합니다 ...
처리 된 값의 반복자를 반환하는 map 대신 imap을 사용합니다.
from multiprocessing import Pool
import tqdm
import time
def _foo(my_number):
square = my_number * my_number
time.sleep(1)
return square
if __name__ == '__main__':
with Pool(2) as p:
r = list(tqdm.tqdm(p.imap(_foo, range(30)), total=30))
솔루션을 찾았습니다 : 조심하세요! 다중 처리로 인해 추정 시간 (루프 당 반복, 총 시간 등)이 불안정 할 수 있지만 진행률 표시 줄은 완벽하게 작동합니다.
참고 : 풀용 컨텍스트 관리자는 Python 버전 3.3에서만 사용할 수 있습니다.
from multiprocessing import Pool
import time
from tqdm import *
def _foo(my_number):
square = my_number * my_number
time.sleep(1)
return square
if __name__ == '__main__':
with Pool(processes=2) as p:
max_ = 30
with tqdm(total=max_) as pbar:
for i, _ in tqdm(enumerate(p.imap_unordered(_foo, range(0, max_)))):
pbar.update()
Xavi Martínez의 답변을 바탕으로 함수를 작성했습니다 imap_unordered_bar
. imap_unordered
처리 막대가 표시되는 유일한 차이점을 제외 하고 동일한 방식으로 사용할 수 있습니다 .
from multiprocessing import Pool
import time
from tqdm import *
def imap_unordered_bar(func, args, n_processes = 2):
p = Pool(n_processes)
res_list = []
with tqdm(total = len(args)) as pbar:
for i, res in tqdm(enumerate(p.imap_unordered(func, args))):
pbar.update()
res_list.append(res)
pbar.close()
p.close()
p.join()
return res_list
def _foo(my_number):
square = my_number * my_number
time.sleep(1)
return square
if __name__ == '__main__':
result = imap_unordered_bar(_foo, range(5))
p_tqdm
대신 사용할 수 있습니다 .
https://github.com/swansonk14/p_tqdm
from p_tqdm import p_map
import time
def _foo(my_number):
square = my_number * my_number
time.sleep(1)
return square
if __name__ == '__main__':
r = p_map(_foo, list(range(0, 30)))
이 접근 방식은 간단하며 작동합니다.
from multiprocessing.pool import ThreadPool
import time
from tqdm import tqdm
def job():
time.sleep(1)
pbar.update()
pool = ThreadPool(5)
with tqdm(total=100) as pbar:
for i in range(100):
pool.apply_async(job)
pool.close()
pool.join()
참고 URL : https://stackoverflow.com/questions/41920124/multiprocessing-use-tqdm-to-display-a-progress-bar
'Program Tip' 카테고리의 다른 글
std :: string에 null 종결자가 포함되어 있습니까? (0) | 2020.11.20 |
---|---|
Genymotion이 Android 가상 장치를 시작하지 않습니다. (0) | 2020.11.20 |
Angular 애플리케이션에 여러 HTTP 인터셉터 추가 (0) | 2020.11.20 |
onClick 핸들러 내의 JavaScript 코드 내에서 문자열을 어떻게 이스케이프합니까? (0) | 2020.11.20 |
WHERE 절에서 별칭 사용 (0) | 2020.11.20 |