Tengo dificultades para entender cómo funciona AsyncIOScheduler y cómo puedo programar una función dentro de la función principal, o cuál es la forma correcta de hacerlo.
¿Cómo puedo ejecutar la función foo cada 10 segundos?
Supongamos que tengo esta estructura:
package/ controllers.py main.py Del archivo controllers.py tengo una función llamada foo y la función es algo como esto:
async def foo(): print('Hello World') Me gustaría ejecutar la función foo (y muchas otras) desde el archivo main.py , y este archivo es como:
import asyncio from controllers import foo, bar from apscheduler.schedulers.asyncio import AsyncIOScheduler async def main(): # Init message print('\nPress Ctrl-C to quit at anytime!\n' ) await asyncio.create_task(bar()) scheduler = AsyncIOScheduler() scheduler.add_job(await asyncio.create_task(foo()), "interval", seconds=10) scheduler.start() if __name__ == "__main__": while True: try: asyncio.run(main()) except Exception as e: print("Exception: " + str(e))¿Es correcto ejecutar el programador de esta manera? ¿O el temporizador se reiniciará cada vez que se ejecute la función principal?
Probé el siguiente código, el intervalo de bucle funciona, pero la función main no.
import asyncio from controllers import foo, bar from apscheduler.schedulers.asyncio import AsyncIOScheduler async def main(): # Init message print('\nPress Ctrl-C to quit at anytime!\n' ) await asyncio.create_task(bar()) if __name__ == "__main__": scheduler = AsyncIOScheduler() scheduler.add_job(foo, "interval", seconds=10) scheduler.start() while True: try: asyncio.get_event_loop().run_forever() asyncio.run(main()) except Exception as e: print("Exception: " + str(e))Si cambié el orden de:
asyncio.get_event_loop().run_forever() asyncio.run(main())para:
asyncio.run(main()) asyncio.get_event_loop().run_forever() Recibo el error: There is no current event loop in thread 'MainThread'.
El ciclo funciona (solo programador), pero la función main no se está ejecutando, ¿cómo puedo juntarlos en un ciclo?
Supongo que desea ejecutar su función main() para siempre, por lo que puede intentarlo de esta manera.
controllers.py
from datetime import datetime async def foo(): print(f'{datetime.now()} Foo') async def bar(): print(f'{datetime.now()} Bar') main.py
import asyncio from controllers import foo, bar from apscheduler.schedulers.asyncio import AsyncIOScheduler async def main(): # Init message print('\nPress Ctrl-C to quit at anytime!\n') scheduler = AsyncIOScheduler() scheduler.add_job(foo, "interval", seconds=2) scheduler.start() while True: await asyncio.create_task(bar()) await asyncio.sleep(1) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.create_task(main()) loop.run_forever()Producción:
Press Ctrl-C to quit at anytime! 2022-01-09 03:38:10.468914 Bar 2022-01-09 03:38:11.472966 Bar 2022-01-09 03:38:12.468882 Foo 2022-01-09 03:38:12.473449 Bar 2022-01-09 03:38:13.477678 Bar 2022-01-09 03:38:14.469389 Foo 2022-01-09 03:38:14.480098 Bar 2022-01-09 03:38:15.483889 Bar 2022-01-09 03:38:16.472584 Foo 2022-01-09 03:38:16.487105 Bar 2022-01-09 03:38:17.492550 Bar 2022-01-09 03:38:18.467403 Foo 2022-01-09 03:38:18.493330 Bar 2022-01-09 03:38:19.496680 Bar 2022-01-09 03:38:20.471553 Foo 2022-01-09 03:38:20.499928 Bar 2022-01-09 03:38:21.503572 Bar 2022-01-09 03:38:22.470329 Foo 2022-01-09 03:38:22.505597 Bar 2022-01-09 03:38:23.510854 Bar 2022-01-09 03:38:24.471455 Foo ... Además, puede ejecutar funciones periódicas sin usar AsyncIOScheduler como este .