web-dev-qa-db-fra.com

Python3 comment asyncio.gather () une liste de fonctions partielles

J'essaie de créer une liste de coroutines pouvant être transmise à asyncio.gather ()

Cependant, je souhaite joindre des arguments à ces corouts lorsque je les appends à la liste.

Ma méthode actuelle indiquée ci-dessous utilise FuncoTools.Partial. Malheureusement, asyncio.gather n'accepte pas une fonction partielle, ce qui a du sens.

Ce qui n'a pas de sens pour moi, c'est comment trouver une solution.

Exemple de code:

async def test(arg1):
    print(arg1)

statements = []

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

results = await asyncio.gather(*statements)

Alors, comment puis-je attacher des arguments à une fonction afin qu'elle puisse toujours être transmise à asyncio.gather?

*ÉDITER

Il semble que j'étais plutôt stupide.

Ma solution était plutôt simple, n'utilisez pas de functools.Partial et simplement annoncez la Coroutine directement à la liste.

Code:

async def test(arg1):
    print(arg1)

async def main():
    statements = []
    statements.append(test("hello_world"))
    results = await asyncio.gather(*statements)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
9
Alex Hodges

Cependant, je souhaite joindre des arguments à ces corouts lorsque je les appends à la liste.

Vous pouvez simplement appelez les fonctions de Coroutin avec leurs arguments requis. Contrairement aux fonctions ordinaires (mais similaires aux générateurs), appeler la fonction COROUTINE ne démarre pas l'exécutant, il renvoie simplement un objet pouvant être utilisé pour conduire son exécution plus tard. Cet objet capture déjà les arguments d'invocation et peut être ajouté à la liste transmise à asyncio.gather.

Par exemple:

statements = []

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

results = await asyncio.gather(*statements)
2
user4815162342