Last active
October 21, 2020 20:18
-
-
Save clebio/d68443eb3afd0803f2453b9a40ecf01d to your computer and use it in GitHub Desktop.
Better Asyncio examples
This file contains 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 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