Created
August 20, 2020 10:29
-
-
Save iKlotho/79ae067807fdabc1992786f0f9cea82c to your computer and use it in GitHub Desktop.
Using tqdm progress bar with gevent
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import gevent | |
import random | |
from gevent import local | |
from contextlib import contextmanager | |
from tqdm import tqdm | |
# globals | |
stash = local.local() | |
count = lambda: stash.count | |
tasks = [] | |
item_count = 30 | |
pbar = tqdm(total=item_count) | |
@contextmanager | |
def progress_manager(): | |
stash.count = 0 | |
yield | |
def spawned_worker(x): | |
""" Some external process """ | |
gevent.sleep(random.uniform(1, 3)) | |
return x | |
def get(x): | |
""" Some network request """ | |
gevent.sleep(random.uniform(1, 3)) | |
return x | |
def pool_worker(x): | |
# wait response from request | |
x = get(x) | |
# spawn a process | |
g = gevent.spawn(spawned_worker, x) | |
# call progress bar when greenlet done | |
g.link_value(progress_bar) | |
# add to global tasks | |
tasks.append(g) | |
return x | |
def progress_bar(greenlet): | |
""" | |
Print progress when greenlet done | |
""" | |
with progress_manager(): | |
stash.count += 1 | |
pbar.update(count()) | |
intasks = [] | |
for i in range(item_count): | |
intasks.append(gevent.spawn(pool_worker, i)) | |
gevent.joinall(intasks) | |
gevent.joinall(tasks) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment