简体   繁体   English

在 asyncio 中等待 while 循环

[英]await while loop in asyncio

How to await while loop?如何等待while循环? 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.我想你必须在 while 循环中加入一些 await asyncio.sleep(0) 左右。 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但是,由于 f2 被阻塞,它实际上不会在被阻塞时打印“内部事件循环”

So you'll get output like所以你会得到 output 像

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 .您也可以在该队列中放置任何东西,不必是1

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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