Skip to content

Instantly share code, notes, and snippets.

@iKlotho
Created August 20, 2020 10:29
Show Gist options
  • Save iKlotho/79ae067807fdabc1992786f0f9cea82c to your computer and use it in GitHub Desktop.
Save iKlotho/79ae067807fdabc1992786f0f9cea82c to your computer and use it in GitHub Desktop.
Using tqdm progress bar with gevent
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