Python Asyncio-在字典内调用函数时不节省时间

Python Asyncio-在字典内调用函数时不节省时间,python,time,python-asyncio,Python,Time,Python Asyncio,我试图使用asyncio来节省处理字典值的时间,但我没有节省任何时间 import asyncio import time async def get_time(t): await asyncio.sleep(t) return str(t) async def ff(): f = dict( d=await get_time(2), e=await get_time(2), f=await get_time(2),

我试图使用asyncio来节省处理字典值的时间,但我没有节省任何时间

import asyncio
import time


async def get_time(t):
    await asyncio.sleep(t)
    return str(t)

async def ff():
    f = dict(
        d=await get_time(2),
        e=await get_time(2),
        f=await get_time(2),
        g=await get_time(2),
        h=await get_time(2),
        i=await get_time(2),
    )
    print(f)

t0 = time.time()
asyncio.run(ff())
print(time.time()-t0)
输出:

12.008311986923218
由于我希望代码异步运行,因此预期的输出时间不足2秒。

等待协同路由()
等待协同路由完成,然后才继续。尽管出现了这样的情况,但在dict构造函数的多个参数中调用
await
与按顺序调用它们无异,因此您的
ff
函数也可以按如下方式编写,其含义完全相同:

async def ff():
    # get_time() executed in sequence
    _d = await get_time(2)
    _e = await get_time(2)
    _f = await get_time(2)
    _g = await get_time(2)
    _h = await get_time(2)
    _i = await get_time(2)
    f = dict(d=_d, e=_e, f=_f, g=_g, h=_h, i=_i)
    print(f)
您要做的是将
get_time()
的所有实例提交到事件循环,然后等待它们完成,收集结果。这可以通过在每个
get\u time()
上调用
asyncio.create\u task()
来完成,或者通过调用
asyncio.gather()
来完成,这正是为此而设计的。例如:

async def ff():
    # get_time() executed in parallel
    d, e, f, g, h, i = await asyncio.gather(
        get_time(2),
        get_time(2),
        get_time(2),
        get_time(2),
        get_time(2),
        get_time(2),
    )
    f = dict(d=d, e=e, f=f, g=g, h=h, i=i)
    print(f)
wait coroutine()
等待coroutine完成,然后再继续。尽管出现了这样的情况,但在dict构造函数的多个参数中调用
await
与按顺序调用它们无异,因此您的
ff
函数也可以按如下方式编写,其含义完全相同:

async def ff():
    # get_time() executed in sequence
    _d = await get_time(2)
    _e = await get_time(2)
    _f = await get_time(2)
    _g = await get_time(2)
    _h = await get_time(2)
    _i = await get_time(2)
    f = dict(d=_d, e=_e, f=_f, g=_g, h=_h, i=_i)
    print(f)
您要做的是将
get_time()
的所有实例提交到事件循环,然后等待它们完成,收集结果。这可以通过在每个
get\u time()
上调用
asyncio.create\u task()
来完成,或者通过调用
asyncio.gather()
来完成,这正是为此而设计的。例如:

async def ff():
    # get_time() executed in parallel
    d, e, f, g, h, i = await asyncio.gather(
        get_time(2),
        get_time(2),
        get_time(2),
        get_time(2),
        get_time(2),
        get_time(2),
    )
    f = dict(d=d, e=e, f=f, g=g, h=h, i=i)
    print(f)