并行化异步函数的多个调用



我有以下场景:

from time import sleep
async def do_a(a):
sleep(0.001)
return 1*a
async def do_b(a):
sleep(0.01)
return 2*a
async def do_c(b):
sleep(1)
return 3*b

async def my_func():
results = []
for i in range(3):
a = await do_a(i)
b = await do_b(a)
c = await do_c(b)
results.append(c)
return results
if __name__ == "__main__":
import asyncio
print(asyncio.run(my_func()))

基本上,我在循环中调用异步函数。执行上面的代码显示它在大约3秒内运行。我想并行调用每个过程,因此预期时间将降至~1s(我知道这一开销有点过于乐观,但至少要优化运行时间一点(。我一直在研究不同的python库,我认为这些库可能会有所帮助,但在决定哪一个在这种情况下有用时遇到了困难。Python的多处理、线程和concurrent.future似乎都实现了一种或另一种形式的并行/并发。我该怎么办?你能告诉我在这种情况下你将如何处理吗?

您应该使用asyncio.sleep而不是time.sleep。如果您希望所有操作都同时运行,这是使用asyncio.gather:的一种方法

import asyncio
async def do_a(a):
await asyncio.sleep(0.001)
return 1*a
async def do_b(a):
await asyncio.sleep(0.01)
return 2*a
async def do_c(b):
await asyncio.sleep(1)
return 3*b
async def do_abc(i):
a = await do_a(i)
b = await do_b(a)
return await do_c(b)
async def my_func():
return await asyncio.gather(*map(do_abc, range(3)))
if __name__ == "__main__":
import asyncio
print(asyncio.run(my_func()))
# [0, 6, 12]

如果实际运行的代码而不是sleep是同步的(阻塞(,那么您基本上也会这样做,只是您必须将工作推迟到执行器。

相关内容

  • 没有找到相关文章

最新更新