Incapaz de agendar nada em assíncio. (Python 3.7.x)

Nov 11 2020

Atualmente estou trabalhando em asyncio com python 3.7.x não tenho certeza sobre a versão exata, agora estou tentando agendar uma tarefa. E não consigo obter uma saída, mesmo quando estou executando a coisa indefinidamente. Aqui está o código que tenho atualmente

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))

Isso dá o seguinte erro:

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'

A chamada de volta call_later()é print_now que eu tentei print_nowe print_now()também tentei usar em loop.run_forever()vez de loop.run_until_complete() e até agora não recebi nada

Às vezes, não recebo nenhuma saída ou recebo um erro diferente.

Respostas

2 Paul Nov 11 2020 at 21:17

Primeiro, sim, você está perdendo um delayargumento. O primeiro deve ser o atraso, enquanto o segundo é um retorno de chamada ( docs ).

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

Em segundo lugar, o retorno de chamada deve ser uma função. O que você está passando é o print_now()que vai avaliar None. Você pode descobrir que

O objeto 'NoneType' não pode ser chamado

Então você vai precisar passar print_now- sem parênteses - como um retorno de chamada. Desta forma, você está passando uma função em vez do resultado de sua aplicação.


Terceiro, as asyncfunções devem ser awaiteditadas. Seu cenário não parece precisar disso, portanto, basta largar a asyncpalavra - chave.

Ao chamar uma função em espera, você cria um novo objeto de co-rotina. O código dentro da função não será executado até que você aguarde a função ou execute-a como uma tarefa

A partir deste post . Você pode querer verificar