tqdm/examples/parallel_bars.py

61 lines
2.1 KiB
Python
Raw Normal View History

from __future__ import print_function
from concurrent.futures import ThreadPoolExecutor
from functools import partial
2020-10-07 22:46:13 +00:00
from multiprocessing import Pool, RLock, freeze_support
from random import random
from threading import RLock as TRLock
from time import sleep
import sys
2020-10-07 22:46:13 +00:00
from tqdm.auto import tqdm, trange
from tqdm.contrib.concurrent import process_map, thread_map
2019-10-31 16:31:18 +00:00
NUM_SUBITERS = 9
PY2 = sys.version_info[:1] <= (2,)
2020-12-18 22:55:41 +00:00
def progresser(n, auto_position=True, write_safe=False, blocking=True, progress=False):
2019-10-31 16:31:18 +00:00
interval = random() * 0.002 / (NUM_SUBITERS - n + 2)
total = 5000
text = "#{}, est. {:<04.2}s".format(n, interval * total)
for _ in trange(total, desc=text, disable=not progress,
2019-11-08 23:53:58 +00:00
lock_args=None if blocking else (False,),
2019-10-31 19:31:53 +00:00
position=None if auto_position else n):
sleep(interval)
# NB: may not clear instances with higher `position` upon completion
# since this worker may not know about other bars #796
2019-10-31 16:31:18 +00:00
if write_safe:
# we think we know about other bars (currently only py3 threading)
if n == 6:
tqdm.write("n == 6 completed")
return n + 1
if __name__ == '__main__':
freeze_support() # for Windows support
2019-10-31 16:31:18 +00:00
L = list(range(NUM_SUBITERS))[::-1]
print("Simple thread mapping")
thread_map(partial(progresser, write_safe=not PY2), L, max_workers=4)
print("Simple process mapping")
process_map(partial(progresser), L, max_workers=4)
2019-10-31 16:31:18 +00:00
print("Manual nesting")
for i in trange(16, desc="1"):
for _ in trange(16, desc="2 @ %d" % i, leave=i % 2):
sleep(0.01)
print("Multi-processing")
2020-10-07 22:46:13 +00:00
tqdm.set_lock(RLock())
2019-10-31 16:31:18 +00:00
p = Pool(initializer=tqdm.set_lock, initargs=(tqdm.get_lock(),))
p.map(partial(progresser, progress=True), L)
2020-10-07 22:46:13 +00:00
print("Multi-threading")
tqdm.set_lock(TRLock())
pool_args = {}
if not PY2:
pool_args.update(initializer=tqdm.set_lock, initargs=(tqdm.get_lock(),))
with ThreadPoolExecutor(**pool_args) as p:
2020-12-18 22:55:41 +00:00
p.map(partial(progresser, progress=True, write_safe=not PY2, blocking=False), L)