Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为多个函数正确实现(并发)异步IO_Python_Python 3.x_Python Asyncio - Fatal编程技术网

Python 为多个函数正确实现(并发)异步IO

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

我有两个函数,它们的执行互不依赖。我试图做的是并发执行它们,而不是顺序同步。我还添加了事件循环,但我无法确定它是否正常工作

这就是实现:

文件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此处完成了一些处理 返回结果
我无法确定这些设备是否同时工作。我正在添加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获取数据,而不是显示不同的示例。