Skip to content

Instantly share code, notes, and snippets.

@1st1
Last active October 20, 2024 19:56

Revisions

  1. 1st1 revised this gist Aug 14, 2018. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion example.py
    Original file line number Diff line number Diff line change
    @@ -14,7 +14,7 @@ async def worker(name, queue):
    # Notify the queue that the "work item" has been processed.
    queue.task_done()

    print(f'Task {name} slept for {sleep_for:.2f} seconds')
    print(f'{name} has slept for {sleep_for:.2f} seconds')


    async def main():
  2. 1st1 created this gist Aug 14, 2018.
    51 changes: 51 additions & 0 deletions example.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,51 @@
    import asyncio
    import random
    import time


    async def worker(name, queue):
    while True:
    # Get a "work item" out of the queue.
    sleep_for = await queue.get()

    # Sleep for the "sleep_for" seconds.
    await asyncio.sleep(sleep_for)

    # Notify the queue that the "work item" has been processed.
    queue.task_done()

    print(f'Task {name} slept for {sleep_for:.2f} seconds')


    async def main():
    # Create a queue that we will use to store our "workload".
    queue = asyncio.Queue()

    # Generate random timings and put them into the queue.
    total_sleep_time = 0
    for _ in range(20):
    sleep_for = random.uniform(0.05, 1.0)
    total_sleep_time += sleep_for
    queue.put_nowait(sleep_for)

    # Create three worker tasks to process the queue concurrently.
    tasks = []
    for i in range(3):
    task = asyncio.create_task(worker(f'worker-{i}', queue))
    tasks.append(task)

    # Wait until the queue is fully processed.
    started_at = time.monotonic()
    await queue.join()
    total_slept_for = time.monotonic() - started_at

    # Cancel our worker tasks.
    for task in tasks:
    task.cancel()

    print('====')
    print(f'3 workers slept in parallel for {total_slept_for:.2f} seconds')
    print(f'total expected sleep time: {total_sleep_time:.2f} seconds')


    asyncio.run(main())