summaryrefslogtreecommitdiffstats
path: root/examples/parallel_bars.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/parallel_bars.py')
-rw-r--r--examples/parallel_bars.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/examples/parallel_bars.py b/examples/parallel_bars.py
new file mode 100644
index 0000000..498fd61
--- /dev/null
+++ b/examples/parallel_bars.py
@@ -0,0 +1,61 @@
+from __future__ import print_function
+
+import sys
+from concurrent.futures import ThreadPoolExecutor
+from functools import partial
+from multiprocessing import Pool, RLock, freeze_support
+from random import random
+from threading import RLock as TRLock
+from time import sleep
+
+from tqdm.auto import tqdm, trange
+from tqdm.contrib.concurrent import process_map, thread_map
+
+NUM_SUBITERS = 9
+PY2 = sys.version_info[:1] <= (2,)
+
+
+def progresser(n, auto_position=True, write_safe=False, blocking=True, progress=False):
+ interval = random() * 0.002 / (NUM_SUBITERS - n + 2) # nosec
+ total = 5000
+ text = "#{0}, est. {1:<04.2}s".format(n, interval * total)
+ for _ in trange(total, desc=text, disable=not progress,
+ lock_args=None if blocking else (False,),
+ 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
+ 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
+ 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)
+
+ 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")
+ tqdm.set_lock(RLock())
+ p = Pool(initializer=tqdm.set_lock, initargs=(tqdm.get_lock(),))
+ p.map(partial(progresser, progress=True), L)
+
+ 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:
+ p.map(partial(progresser, progress=True, write_safe=not PY2, blocking=False), L)