为多个函数正确实现(并发)asyncio

Cod*_*aya 5 python python-3.x python-asyncio

我有几个函数,它们的执行并不相互依赖。我想做的是同时执行它们而不是顺序执行(同步)。我也添加了事件循环,但我无法确定它是否正常工作。

这是实现:

文件一:

import file2

def funcA():
    a, b = 1, 2
    file2.main(a, b)
Run Code Online (Sandbox Code Playgroud)

文件2:

def main(a, b):
    asyncio.get_event_loop().run_until_complete(_main(a, b))

async def _main(a, b):
     out1 = await funcA(a, b)
     out2 = await funcB(a, b)
     out3 = await funcC(a, b)

async def funcA(a, b):
    result = 1 # some processing done here
    return result

async def funcB(a, b):
    result = 1 # some processing done here
    return result

async def funcC(a, b):
    result = 1 # some processing done here
    return result
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚这些是否同时工作。我添加time.sleep(10)任何函数,执行都会停止。我不希望它们在后台运行,因为我需要这些函数的输出

Roy*_*012 9

执行您想要的操作的一种方法是在 main 的异步版本中使用asyncio.run()inmain和 then 。gather要模拟长时间处理,请使用asyncio.sleep()参见以下代码:

import asyncio

def main(a, b):
    res = asyncio.run(async_main(a, b))
    print(f"in main, result is {res}")

async def funcA(a, b):
    print('funcA - start')
    await asyncio.sleep(3)
    result = (a+b) # some processing done here
    print('funcA - end')

    return result

async def funcB(a, b):
    print('funcB - start')
    await asyncio.sleep(3)
    result = (a+b)*2 # some processing done here
    print('funcB - end')
    return result

async def funcC(a, b):
    print('funcC - start')
    await asyncio.sleep(3)
    result = (a+b)*3 # some processing done here
    print('funcC - end')

    return result

async def async_main(a, b):
    print("in async_main")
    res = await asyncio.gather(funcA(a, b), funcB(a, b), funcC(a, b))
    print(f"in async_main, result is {res}")
    return res

if __name__ == "__main__":
    main(1, 2)
Run Code Online (Sandbox Code Playgroud)

结果是:

import asyncio

def main(a, b):
    res = asyncio.run(async_main(a, b))
    print(f"in main, result is {res}")

async def funcA(a, b):
    print('funcA - start')
    await asyncio.sleep(3)
    result = (a+b) # some processing done here
    print('funcA - end')

    return result

async def funcB(a, b):
    print('funcB - start')
    await asyncio.sleep(3)
    result = (a+b)*2 # some processing done here
    print('funcB - end')
    return result

async def funcC(a, b):
    print('funcC - start')
    await asyncio.sleep(3)
    result = (a+b)*3 # some processing done here
    print('funcC - end')

    return result

async def async_main(a, b):
    print("in async_main")
    res = await asyncio.gather(funcA(a, b), funcB(a, b), funcC(a, b))
    print(f"in async_main, result is {res}")
    return res

if __name__ == "__main__":
    main(1, 2)
Run Code Online (Sandbox Code Playgroud)