Python 并行化异步函数的多个调用
我有以下情况:Python 并行化异步函数的多个调用,python,asynchronous,concurrency,multiprocessing,python-asyncio,Python,Asynchronous,Concurrency,Multiprocessing,Python Asyncio,我有以下情况: 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):
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()))
基本上,我是在循环中调用异步函数。执行上述代码显示它在~3s内运行。我希望并行调用每个过程,因此预期时间将下降到~1s(我知道这一开销有点过于乐观,但至少要优化一点运行时间)。我一直在研究我认为可能有帮助的不同python库,但在确定哪一个在本例中有用时遇到了困难。Python的多处理、线程和concurrent.futures似乎都实现了某种形式的并行/并发。
我该怎么办?您能告诉我在这种情况下如何处理吗?您应该使用而不是。如果您希望所有内容同时运行,这是一种方法:
导入异步IO
异步def do_a(a):
等待异步睡眠(0.001)
返回1*a
异步def do_b(a):
等待异步睡眠(0.01)
返回2*a
异步def do_c(b):
等待asyncio.sleep(1)
返回3*b
异步def do_abc(i):
a=等待完成a(i)
b=等待完成b(a)
返回等待完成c(b)
异步定义my_func():
return wait asyncio.gather(*映射(do_abc,范围(3)))
如果名称=“\uuuuu main\uuuuuuuu”:
导入异步
打印(asyncio.run(my_func()))
# [0, 6, 12]
如果实际运行的代码(而不是sleep
的代码)是同步的(阻塞),那么您基本上也会执行相同的操作,只是您必须将该工作推迟到您应该使用而不是的时间。如果您希望所有内容同时运行,这是一种方法:
导入异步IO
异步def do_a(a):
等待异步睡眠(0.001)
返回1*a
异步def do_b(a):
等待异步睡眠(0.01)
返回2*a
异步def do_c(b):
等待asyncio.sleep(1)
返回3*b
异步def do_abc(i):
a=等待完成a(i)
b=等待完成b(a)
返回等待完成c(b)
异步定义my_func():
return wait asyncio.gather(*映射(do_abc,范围(3)))
如果名称=“\uuuuu main\uuuuuuuu”:
导入异步
打印(asyncio.run(my_func()))
# [0, 6, 12]
如果实际运行的代码而不是
sleep
是同步的(阻塞),那么您基本上也会这样做,只是您必须将该工作推迟到一个时间。哦,我打算提供一个小示例。我把睡眠调用放在我做“繁重”工作的地方(在do_a中查询数据库,在do_b中读取磁盘,在do_c中进行矩阵乘法…)哦,我打算提供一个小例子。我把睡眠呼叫放在我做“繁重”工作的地方(在do_a中查询数据库,在do_b中读取磁盘,在do_c中执行矩阵乘法…)非常感谢!我还需要深入研究遗嘱执行人,但这似乎不是我的情况。非常感谢!我还需要深入研究遗嘱执行人,但这似乎不是我的情况。