gpt4 book ai didi

python - 如何使包含 for 循环的函数成为非阻塞的?

转载 作者:太空狗 更新时间:2023-10-30 02:24:19 24 4
gpt4 key购买 nike

我正在尝试使以下代码异步:

import asyncio
import random

async def count():
l = []
for i in range(10000000):
l.append(i)
return random.choice(l)

async def long_task1():
print('Starting task 1...')
task_output = await count()
print('Task 1 output is {}'.format(task_output ))


async def long_task2():
print('Starting task 2...')
task_output = await count()
print('Task 2 output is {}'.format(task_output ))

async def main():
await asyncio.gather(long_task1(), long_task2())

if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())

目前它将同步工作。

是不是count函数缺少await语句?

我尝试重新编写函数以包含 await:

async def count():
l = []
for i in range(10000000):
l.append(i)
choice = await random.choice(l)
return choice

它将异步启动(Starting task 1...Starting task 2... 将一个接一个地打印出来),但随后我得到一个错误:

TypeError: object int can't be used in 'await' expression

我知道错误发生是因为 random.choice(l) 的结果不是可等待的(协程),但我不知道如何在不绕圈子的情况下解决这个问题。我是否需要以某种方式将 for 循环重构为一个单独的协程?

最佳答案

Is it because the count function is lacking await statement?

简而言之,是的,您已正确识别问题。要并行执行任务,您不仅需要指定 async def,还需要等待暂停执行的内容,从而将控制权返回给事件循环。在 asyncio 中,这通常是一种会阻塞同步程序的调用,例如 sleep 或从尚未准备好读取的套接字读取。

强制temporary suspension ,您可以在 count 的循环内添加 await asyncio.sleep(0)。在普通函数(如 random.choice)前添加 await 不起作用,因为 await 需要一个实现可等待接口(interface)的对象,在你的代码中 random.choice 只返回一个整数。

关于python - 如何使包含 for 循环的函数成为非阻塞的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54311325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com