Plánování periodické volání funkce v Litr/asyncio

0

Otázka

Potřebuji naplánovat periodické volání funkce v pythonu (tj. volala každou minutu), bez blokování event loop (já používám Litrovou rámec s asyncio).

V podstatě je třeba předložit práci na událost, smyčky, časovač, tak, že webserver udržuje slouží příchozí požadavky do té doby, a to zhruba každou minutu volá mé funkce.

Zkoušel jsem mnoho způsobů, například:

def do_work():
    print("WORK", flush=True)

async def schedule():
    await asyncio.sleep(0)
    print("scheduling")
    loop = asyncio.get_running_loop()
    t = loop.call_later(2, do_work)
    print("scheduled")
    

asyncio.run(schedule())

Ale to taky nikdy dostane popraven (jako výše uvedený kód), nebo to blokuje webserver main event loop. Například, kód výše bych očekával (protože se to dělá v rámci asyncio.run a schedule čeká časovač), že "plánování", bude vytištěna po (nebo během), nastavení serveru, ale to není tento případ, to blokuje.

python python-asyncio quart
2021-11-23 05:34:06
1

Nejlepší odpověď

1

Můžete použít jako pozadí úkol , který je spuštěn na spuštění,

async def schedule():
    while True:
        await asyncio.sleep(1)
        await do_work()

@app.before_serving
async def startup():
    app.add_background_task(schedule)

který bude probíhat schedule po celou dobu životnosti aplikace, jsou zrušeny při vypnutí.

2021-11-23 19:15:22

Poznámka: to vyžaduje litr 0.16.
Crowphale

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................