56 lines
1.4 KiB
Python
56 lines
1.4 KiB
Python
import asyncio
|
|
import random
|
|
import time
|
|
|
|
|
|
async def worker(name, queue):
|
|
while True:
|
|
#get a work item out of the queue.
|
|
sleep_for = await queu.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'{name} has 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(2):
|
|
sleep_for = random.uniform(0.05, 1.0)
|
|
total_sleep_time += sleep_for
|
|
queue.put_nowait(sleep_for)
|
|
|
|
#create three worker tasks to process teh queue concurrently
|
|
tasks = []
|
|
for i in range(3):
|
|
task = asyncio.create_task(worker(f'worker-{i}', queue))
|
|
tasks.append(task)
|
|
|
|
started_at = time.monotonic()
|
|
await queue.join()
|
|
|
|
total_sleep_time = time.monotonic() - started_at
|
|
|
|
#cancel our worker tasks
|
|
for task in tasks:
|
|
task.cancel()
|
|
|
|
#wait until all worker tasks are cancelled.
|
|
await asyncio.gather(*tasks, return_exceptions=True)
|
|
|
|
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())
|