如何在Python中使用for循环异步运行函数?

4

嗨,我想知道如何在Python中异步调用for循环内的函数,以使for循环更快地执行。 在这种情况下,bar()是一个耗时较长的函数,这就是为什么我希望对它的调用是非阻塞的原因。

以下是我想要重构的内容:

def bar(item):
    //manipulate item
    return newItem

newItems = []
for item in items:
    newItem = foo(item)
    newItems.append[newItem]

以下是我尝试的内容:

async def bar(item):
    //manipulate item
    return newItem

async def foo():
    newItems = [bar(item) for item in items]
    newItems = await asyncio.gather(*newItems)
    return newItems

newItems = asyncio.run(foo())

好像不起作用,因为每次函数调用仍然会等待前一个函数完成才开始。 我希望能提供一些有关我可能做错了什么的提示。 非常感谢您提供的任何和所有帮助!


你可能需要利用Python的多进程能力来完成你正在做的事情,因为异步通常只有在需要等待I/O操作时才有用。请参阅使用并发、并行和asyncio加速Python以获取更多澄清信息。 - itprorh66
1个回答

2
如果你的任务确实是异步的,你可以按照以下方式进行操作:
import asyncio


async def bar(item: int) -> int:
    # manipulate item
    print("Started")
    await asyncio.sleep(5)
    print("Finished")
    return item ** 2


async def foo():
    items = range(1, 10)
    tasks = [bar(item) for item in items]
    new_items = await asyncio.gather(*tasks)
    return new_items

if __name__ == '__main__':
    results = asyncio.run(foo())
    print(results)


1
也许我的问题源于我对于什么才是“真正的异步函数”并不了解,因为我曾认为任何函数都可以变成异步函数。感谢您的回复。 - plynch714
@plynch714 如果我的答案解决了异步任务的问题,请将其标记为解决方案。实际上,如果您的任务不是异步的,则应使用multiprocessing模块来处理CPU密集型任务。 - Artiom Kozyrev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接