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中执行矩阵乘法…)非常感谢!我还需要深入研究遗嘱执行人,但这似乎不是我的情况。非常感谢!我还需要深入研究遗嘱执行人,但这似乎不是我的情况。