立即运行任务,然后等待

2024-05-16 01:43:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,代码如下所示:

import time
import asyncio

async def my_async_function(i):
    print("My function {}".format(i))

async def start():
    requests = []

    # Create multiple requests
    for i in range(5):
        print("Creating request #{}".format(i))
        requests.append(my_async_function(i))

    # Do some additional work here
    print("Begin sleep")
    time.sleep(10)
    print("End sleep")

    # Wait for all requests to finish
    return await asyncio.gather(*requests)

asyncio.run(start())

无论“额外工作”需要多长时间,请求似乎只在“结束睡眠”之后运行。我猜asyncio.gather才是真正开始执行它们的地方。我怎样才能让请求(akamy_async_function())立即开始,做额外的工作,然后等待所有请求在最后完成

编辑: 根据Krumelur的评论和我自己的发现,我所寻找的结果如下:

import time
import asyncio
import random

async def my_async_function(i):
    print("Begin function {}".format(i))
    await asyncio.sleep(int(random.random() * 10))
    print("End function {}".format(i))

async def start():
    requests = []

    # Create multiple requests
    for i in range(10):
        print("Creating request #{}".format(i))
        requests.append(asyncio.create_task(my_async_function(i)))

    # Do some additional work here
    print("Begin sleep")
    await asyncio.sleep(5)
    print("End sleep")

    # Wait for all requests to finish
    return await asyncio.gather(*requests)

asyncio.run(start())

只有当my_async_function和“额外工作”都是等待的,这样事件循环才能给它们中的每一个提供执行时间时,这才有效。您需要create_task(如果您知道它是一个协同路由)或ensure_future(如果它可能是一个协同路由或未来)来允许请求立即运行,否则它们仍然只有在您gather时才会运行


Tags: importasyncioformatforasynctimemydef
1条回答
网友
1楼 · 发布于 2024-05-16 01:43:51

time.sleep()是一个同步操作

您需要使用异步睡眠并等待它, 例如

await asyncio.sleep(10)

其他异步代码将仅在当前任务产生时运行(即,通常在“等待”某些内容时)

使用异步代码意味着您必须随时随地使用异步。异步操作适用于I/O绑定的应用程序。如果“额外工作”主要受CPU限制,那么最好使用线程(但要注意全局解释器锁!)

相关问题 更多 >