简体   繁体   中英

await while loop in asyncio

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM