Skip to content

Instantly share code, notes, and snippets.

@clebio
Last active October 21, 2020 20:18
Show Gist options
  • Save clebio/d68443eb3afd0803f2453b9a40ecf01d to your computer and use it in GitHub Desktop.
Save clebio/d68443eb3afd0803f2453b9a40ecf01d to your computer and use it in GitHub Desktop.
Better Asyncio examples
import asyncio
import random
import time
WORKERS = 3
QUEUE_DEPTH = 5
async def worker(name, queue):
results = []
while not queue.empty():
sleep_for = await queue.get()
await asyncio.sleep(sleep_for)
print(f"{name} has slept for {sleep_for:.2f} seconds")
results.append(sleep_for)
queue.task_done()
return results
async def main():
started_at = time.monotonic()
queue = asyncio.Queue()
total_sleep_time = 0
for _ in range(QUEUE_DEPTH):
sleep_for = random.uniform(0.05, 1.0)
total_sleep_time += sleep_for
queue.put_nowait(sleep_for)
tasks = []
for i in range(WORKERS):
task = asyncio.create_task(worker(f"worker-{i}", queue))
tasks.append(task)
await queue.join()
results = await asyncio.gather(*tasks) # , return_exceptions=True)
total_slept_for = time.monotonic() - started_at
print(results)
print(f"3 workers slept in parallel for {total_slept_for:.2f} seconds")
print(f"total expected sleep time: {total_sleep_time:.2f} seconds")
if __name__ == "__main__":
asyncio.run(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment