Impossible de planifier quoi que ce soit dans asyncio. (Python 3.7.x)

Nov 11 2020

Je travaille actuellement sur asyncio avec python 3.7.x pas sûr de la version exacte, en ce moment j'essaye de planifier une tâche. Et je suis incapable d'obtenir une sortie, même lorsque j'exécute la chose pour toujours. Voici le code que j'ai actuellement

import asyncio

async def print_now():
  print("Hi there")

loop = asyncio.get_event_loop()
loop.call_later(print_now())
loop.run_until_complete(asyncio.sleep(1))

Cela donne l'erreur suivante:

Traceback (most recent call last):
  File "D:\Coding\python\async\main.py", line 7, in <module>
    loop.call_later(print_now())
TypeError: call_later() missing 1 required positional argument: 'callback'

Le rappel call_later()est print_now que j'ai essayé juste print_nowet print_now()j'ai également essayé d'utiliser à la loop.run_forever()place de loop.run_until_complete() et jusqu'à présent, je n'ai rien obtenu

Parfois, je n'obtiens aucune sortie ou une erreur différente.

Réponses

2 Paul Nov 11 2020 at 21:17

Premièrement, oui, vous manquez un delayargument. Le premier est censé être le délai tandis que le second est un rappel ( docs ).

loop.call_later(delay, callback, *args, context=None)

Deuxièmement, le rappel est censé être une fonction. Ce que vous passez, c'est print_now()ce que va évaluer None. Vous pourriez découvrir que

L'objet 'NoneType' n'est pas appelable

Vous allez donc devoir passer print_now- sans parenthèses - comme un rappel. De cette façon, vous passez une fonction au lieu du résultat de son application.


Troisièmement, les asyncfonctions sont censées être awaitmodifiées. Votre scénario ne semble pas en avoir besoin, alors supprimez simplement le asyncmot - clé.

Lorsque vous appelez une fonction en attente, vous créez un nouvel objet coroutine. Le code à l'intérieur de la fonction ne s'exécutera pas tant que vous n'aurez pas attendu la fonction ou que vous ne l'exécuterez pas comme tâche

De ce post . Vous voudrez peut-être vérifier