python中for循环中的异步作业[重复]

Posted

技术标签:

【中文标题】python中for循环中的异步作业[重复]【英文标题】:Asynchronous jobs in for loop in python [duplicate] 【发布时间】:2020-12-20 11:19:26 【问题描述】:

我有一个函数

async def hello(a):
    await asyncio.sleep(2)
    print(a)

我想为列表中的几个元素异步调用这个函数

list =  ['words','I','need','to','print','parallely']

类似这样,但下面的代码一个接一个地运行。

for word in list:
    await hello(word)

有没有更好的方法来做到这一点?我用过asyncio.create_task,但不知道如何在循环中使用它们。

【问题讨论】:

不要使用list作为变量名,它会影响内置类型list 【参考方案1】:

这是一个应该如何工作的示例:

import asyncio

list_1 = 'hi i am cool'.split()

async def hello(a):
    await asyncio.sleep(2)
    print(a)
    
async def run_tasks():
   tasks = [hello(word) for word in list_1]
   await asyncio.wait(tasks)

def main():
   loop = asyncio.new_event_loop()
   asyncio.set_event_loop(loop)
   loop.run_until_complete(run_tasks())
   loop.close()

main()

样本输出:

am
i
cool
hi

以上代码主要用于演示,但新的更简单的方法是:

def main2():
    asyncio.run(run_tasks())

main2()

样本输出:

i
hi
cool
am

注意:

按照 cmets 的建议,为了保持输入的顺序,将 run_tasks 定义为:

async def run_tasks():
   tasks = [hello(word) for word in list_1]
   await asyncio.gather(*tasks)

【讨论】:

要保留输入的顺序,可以使用asyncio.gather(*tasks) 你是这个意思吗? 是的。如果你运行它,它应该按顺序打印“hi”“I”“am”“cool”。 RuntimeError: Cannot run the event loop while another loop is running 在运行 main() 时遇到上述相同代码的错误 import nest_asyncio nest_asyncio.apply() 添加了这两行并且它的工作!谢谢

以上是关于python中for循环中的异步作业[重复]的主要内容,如果未能解决你的问题,请参考以下文章

嵌套for循环中的python数组[重复]

在python中的单个列表上使用多个变量(for循环)[重复]

Python lambda不记得for循环中的参数[重复]

表达式中的Python“in”关键字与for循环中的[重复]

我的 for 循环没有根据条件删除数组中的项目? Python [重复]

Python3基础 list 使用for循环 删除列表中的重复项