Python 3.x Python3如何asyncio.gather()部分函数的列表

Python 3.x Python3如何asyncio.gather()部分函数的列表,python-3.x,python-asyncio,Python 3.x,Python Asyncio,我正在尝试创建可以传递给asyncio.gather()的协同路由列表 但是,我想在将这些协程添加到列表中时将参数添加到这些协程中 下面显示的当前方法使用functools.partial。不幸的是,asyncio.gather不接受分部函数,这是有意义的 对我来说没有意义的是如何找到解决方案 示例代码: async def test(arg1): print(arg1) statements = [] function = functools.partial(test, "hell

我正在尝试创建可以传递给asyncio.gather()的协同路由列表

但是,我想在将这些协程添加到列表中时将参数添加到这些协程中

下面显示的当前方法使用functools.partial。不幸的是,asyncio.gather不接受分部函数,这是有意义的

对我来说没有意义的是如何找到解决方案

示例代码:

async def test(arg1):
    print(arg1)

statements = []

function = functools.partial(test, "hello world")
statements.append(function)

results = await asyncio.gather(*statements)
那么,如何将参数附加到函数,以便它仍然可以传递给asyncio.gather

*编辑

看来我太傻了

我的解决方案相当简单,不使用functools.partial,只需将协同程序直接附加到列表中

代码:

但是,我想在将这些协程添加到列表中时将参数添加到这些协程中

您可以简单地使用必需的参数调用协程函数。与普通函数不同(但与生成器类似),调用协程函数不会开始执行它,它只返回一个对象,可用于稍后驱动其执行。此对象已捕获调用参数,可以添加到传递给
asyncio.gather
的列表中

例如:

statements = []

statements.append(test("hello world"))
# ...

results = await asyncio.gather(*statements)
注意:如果需要多次从函数中收集结果,则此操作将不起作用。有关此特殊情况的解决方案,请参阅。

只收集一次多个异步函数调用的结果 如果只需要运行一次
async
函数调用序列,只需将其立即返回的协程对象存储在列表中,将未打包的列表传递给
asyncio.gather
,然后
wait
从协程收集最终返回值

async def upper_cased(值:str)->str:
等待asyncio.sleep(1)
返回值。上限()
协同程序=[
上外壳(“h”),
上(下称"东"),,
上_壳(“l”),
上_壳(“l”),
上(下称"o"),,
上盖(“”),
上外壳(“w”),
上(下称"o"),,
上外壳(“r”),
上_壳(“l”),
上(下称"d"),,
]
打印(“.join(等待asyncio.gather(*coroutines)))
#打印HELLO WORLD
这是因为与普通函数不同,调用
async
函数(不等待)不会开始执行它,它只返回一个包含函数调用的所有必要细节(包括参数值)的对象。稍后可以使用此对象以不同的方式完成其执行,其中之一是使用
wait

多次收集多个异步函数调用的结果 如果需要多次运行相同序列的
async
函数(带有预定参数),只需将它们的返回值存储在一个列表中,然后将未打包的列表传递给
asyncio。gather
将不起作用

这是因为协同路由对象只能等待一次。当它们已经返回值时,再次等待它们将引发
运行时错误

async def random_cased(值:str)->str:
等待asyncio.sleep(1)
如果random.randint(0,1)==1:
返回值。上限()
返回值。lower()
协同程序=[
随机情况(“h”),
随机情况(“e”),
随机分格(“l”),
随机分格(“l”),
随机分格(“o”),
随机大写(“”),
随机情况(“w”),
随机分格(“o”),
随机分格(“r”),
随机分格(“l”),
随机情况(“d”),
]
打印(“.join(等待asyncio.gather(*coroutines)))
#打印HeLlO wOrLd(或任何其他随机大小写的变体)
打印(“.join(等待asyncio.gather(*coroutines)))
#引发运行时错误(无法重用已等待的协同程序)
对于这种情况,可以使用
functools.partial
对象来存储
async
函数及其参数值

部分函数=[
functools.partial(随机大写,“h”),
functools.partial(随机大写“e”),
functools.partial(随机大小写为“l”),
functools.partial(随机大小写为“l”),
functools.partial(随机大小写为“o”),
functools.partial(随机大小写为“”),
functools.partial(随机大写,“w”),
functools.partial(随机大小写为“o”),
functools.partial(随机大写,“r”),
functools.partial(随机大小写为“l”),
functools.partial(随机分格,“d”),
]
打印(“.join(等待asyncio.gather(*[func()表示部分函数中的func]))
#打印HeLlO wOrLd(或任何其他随机大小写的变体)
打印(“.join(等待asyncio.gather(*[func()表示部分函数中的func]))
#打印HeLlO wOrLd(或任何其他随机大小写的变体)
打印(“.join(等待asyncio.gather(*[func()表示部分函数中的func]))
#打印HeLlO wOrLd(或任何其他随机大小写的变体)
如果需要,也可以使用其他容器代替
functools.partial
。例如,一个用于存储函数的列表和另一个用于存储其参数的列表

statements = []

statements.append(test("hello world"))
# ...

results = await asyncio.gather(*statements)