Python 为多个函数正确实现(并发)异步IO
我有两个函数,它们的执行互不依赖。我试图做的是并发执行它们,而不是顺序同步。我还添加了事件循环,但我无法确定它是否正常工作 这就是实现: 文件1: 导入文件2 def funcA: a、 b=1,2 file2.maina,b 文件2: def maina,b: asyncio.get\u event\u loop.run\u直到完成\u maina,b 异步def_maina,b: out1=等待funcAa,b out2=等待funcBa,b out3=等待函数,b 异步定义funcAa,b: 结果=1此处完成了一些处理 返回结果 异步定义funcBa,b: 结果=1此处完成了一些处理 返回结果 异步定义函数,b: 结果=1此处完成了一些处理 返回结果Python 为多个函数正确实现(并发)异步IO,python,python-3.x,python-asyncio,Python,Python 3.x,Python Asyncio,我有两个函数,它们的执行互不依赖。我试图做的是并发执行它们,而不是顺序同步。我还添加了事件循环,但我无法确定它是否正常工作 这就是实现: 文件1: 导入文件2 def funcA: a、 b=1,2 file2.maina,b 文件2: def maina,b: asyncio.get\u event\u loop.run\u直到完成\u maina,b 异步def_maina,b: out1=等待funcAa,b out2=等待funcBa,b out3=等待函数,b 异步定义funcAa,b
我无法确定这些设备是否同时工作。我正在添加time.sleep10在任何函数中,执行都会停止。我不希望它们在后台运行,因为我需要这些函数的输出。请帮助大家。一种方法是在main中使用asyncio.run,然后在main的异步版本中收集。要模拟长时间处理,请使用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)
结果是:
in async_main
funcA - start
funcB - start
funcC - start
funcA - end
funcB - end
funcC - end
in async_main, result is [3, 6, 9]
in main, result is [3, 6, 9]
一种方法是在main中使用asyncio.run,然后在main的异步版本中进行收集。要模拟长时间处理,请使用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)
结果是:
in async_main
funcA - start
funcB - start
funcC - start
funcA - end
funcB - end
funcC - end
in async_main, result is [3, 6, 9]
in main, result is [3, 6, 9]
有一个疑问,我应该如何从funcA,funcB和funcC获取输出?因此在res=wait asyncio.gatherfuncAa,b,funcBa,b,funcA,b,res中将是一个列表或元组,以便我可以将其解压缩到其他变量?是的。你得到的结果是一个列表,其中每个元素对应于一个函数调用——第一个元素对应于你正在“收集”的第一个函数,第二个元素对应于第二个函数,等等。你现在可以用这个列表做任何你想做的事情:解压它,迭代它,处理它,等等。顺便说一句,如果帖子回答了你的问题,你介意“接受它”作为后代的答案吗?有一个疑问,我应该如何从funcA,funcB和funcC获取输出?因此在res=wait asyncio.gatherfuncAa,b,funcBa,b,funcA,b,res中将是一个列表或元组,以便我可以将其解压缩到其他变量?是的。你得到的结果是一个列表,其中每个元素对应于一个函数调用——第一个元素对应于你正在“收集”的第一个函数,第二个元素对应于第二个函数,等等。你现在可以用这个列表做任何你想做的事情:解压它,迭代它,处理它,等等。顺便说一句,如果帖子回答了你的问题,你介意“接受它”作为后代的答案吗?根据经验,不等待任何东西的异步函数很可能是浪费了异步的使用。与线程不同,asyncio基于协作多任务,与async for和async with一起等待,async with是可以进行上下文切换的地方。好信息。asyncio即使尝试了多次,仍然让我感到困惑。我学习了很多教程,但大多数教程都会显示如何从URL获取数据,而不是显示不同的示例。根据经验,不等待任何内容的异步函数很可能是浪费了异步的使用。与线程不同,asyncio基于协作多任务,与async for和async with一起等待,async with是可以进行上下文切换的地方。好信息。asyncio即使尝试了多次,仍然让我感到困惑。我学习了很多教程,但大多数教程都将显示如何从URL获取数据,而不是显示不同的示例。