в каком порядке, если есть два asyncio.get_event_l oop? - PullRequest
0 голосов
/ 04 марта 2020

Необходимо сделать две вещи: разместить веб-сайт и отправить уведомление. Поэтому я использую следующие способы решения этой проблемы:

from aiohttp import web
import asyncio


async def _send_proactive_message():
    ...

async def pre_init():
    await asyncio.sleep(20)
    await _send_proactive_message()

APP = web.Application()
APP.router.add_post("/api/messages", messages)
APP.router.add_get("/api/notify", notify)




if __name__ == '__main__':


    event_loop = asyncio.get_event_loop()
    try:
        event_loop.create_task(pre_init())
        web.run_app(APP, host="localhost", port=CONFIG.PORT)

    finally:
        event_loop.close()

Поскольку в web.run_app есть один event_l oop , Я не понимаю, какой из них запускается первым и как управлять каждым event_l oop.

1 Ответ

0 голосов
/ 04 марта 2020

Ваш способ создать задачу перед запуском события l oop в порядке, но только если run_app не будет установлен и использовать другое событие l oop.

Лучший способ - создать задачи или другие асинхронные c объекты после запуска события l oop. Таким образом, вы убедитесь, что созданные объекты прикреплены к активному действующему событию l oop.

. В вашем случае лучший способ сделать это - использовать on_startup hook:

async def pre_init(app):
    await _send_proactive_message()


async def make_app():
    app = web.Application()

    app.router.add_post("/api/messages", messages)
    app.router.add_get("/api/notify", notify)

    app.on_startup.append(pre_init)

    return app


web.run_app(make_app())
...