Program Tip

다중 처리 : tqdm을 사용하여 진행률 표시 줄 표시

programtip 2020. 11. 20. 09:29
반응형

다중 처리 : 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

반응형