How to await while loop? I have the following code snippet:
import asyncio
from asyncio.tasks import sleep
import time
running = True
async def f1():
global running
print(f"Running: {running}")
print("f1() started.")
### await the while loop below
while running:
print(f"Inside while loop")
###
print(f"Running: {running}")
print("f1() ended")
async def f2():
global running
print("f2() started.")
# this should be blocking code
time.sleep(0.5)
print("f2 ended.")
running = False
async def main():
await asyncio.gather(f1(), f2())
asyncio.run(main())
Basically, what I want is:
# 1. Start f1(). f1() has a while loop.
# 2. Start f2().
# 3. Notify f1() to break the while loop.
I guess you have to put in some await asyncio.sleep(0) or so into the while loop. It just has to be some await call that gives others the chance to do something
import asyncio
from asyncio.tasks import sleep
import time
running = True
async def f1():
global running
print(f"Running: {running}")
print("f1() started.")
### await the while loop below
while running:
print(f"Inside while loop")
await asyncio.sleep(0)
###
print(f"Running: {running}")
print("f1() ended")
async def f2():
global running
print("f2() started.")
# this should be blocking code
time.sleep(0.5)
print("f2 ended.")
running = False
async def main():
await asyncio.gather(f1(), f2())
asyncio.run(main())
that works for me
Without globals:
import asyncio
from asyncio.tasks import sleep
import time
async def f1( q ):
print("f1() started.")
### await the while loop below
## Start listener
event = asyncio.ensure_future( q.get() )
while True:
print( "Inside While Loop" )
if event.done():
break
else:
await asyncio.sleep( 0.01 )
###
print("f1() ended")
async def f2( q ):
print("f2() started.")
# this should be blocking code
time.sleep( 3 )
print("f2 ended.")
await q.put( 1 )
async def main():
q = asyncio.Queue( 1 )
await asyncio.gather(f1( q ), f2( q ))
asyncio.run(main())
But, since f2 is blocking it wont actually print "Inside event loop" while it is being blocked
So you'll get output like
f1() started.
Inside While Loop
f2() started.
f2 ended.
Inside While Loop
f1() ended
Also you can put just about anything in that queue, doesnt have to be 1
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.