What would be a good approach to execute two asynchronous loops running in parallel in Python, using async/await
?
I've thought about something like the code below, but can't wrap my head around how to use async
/await
/EventLoop
in this particular case.
import asyncio
my_list = []
def notify():
length = len(my_list)
print("List has changed!", length)
async def append_task():
while True:
time.sleep(1)
await my_list.append(random.random())
notify()
async def pop_task():
while True:
time.sleep(1.8)
await my_list.pop()
notify()
loop = asyncio.get_event_loop()
loop.create_task(append_task())
loop.create_task(pop_task())
loop.run_forever()
Expected output:
$ python prog.py
List has changed! 1 # after 1sec
List has changed! 0 # after 1.8sec
List has changed! 1 # after 2sec
List has changed! 2 # after 3sec
List has changed! 1 # after 3.6sec
List has changed! 2 # after 4sec
List has changed! 3 # after 5sec
List has changed! 2 # after 5.4sec
this works fine:
note: you wanted to await fast non-io bound operations (
list.append
andlist.pop
that are not even coroutines); what you can do isawait
asyncio.sleep(...)
(which is a coroutine and yield control back to the caller):time.sleep
itself is blocking and does not play nicely withawait
.