aiohttp и asyncio

Доброго времени суток всем! Есть примерно такой код:

import aiohttp



def handle(request):
    pass


async def main():
    pass 


app = aiohttp.web.Application()
app.router.add_post('/', handle)


if __name__ == '__main__':
    aiohttp.web.run_app(app)

Могу ли я паралельно c aiohttp.web.run_app(app) выполнять асинхронную функцию main()


Ответы (1 шт):

Автор решения: eri

Самый простой вариант - запустить таск. Но внутри main должен await на каждой итерации (если это цикл) или хотяб await asyncio.sleep(0) между тяжелыми кусками, а блокирующие операции вынесенны в экзекутор:

import aiohttp
def handle(request):
    pass
async def main():
    while True:
        await asyncio.sleep(1)
        print('.') 
app = aiohttp.web.Application()
app.router.add_post('/', handle)
if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.create_task(main())
    aiohttp.web.run_app(app)

Второй вариант - вынести aiohttp в runner

async def run():
    runner = web.AppRunner(app)
    await runner.setup()
    site = web.TCPSite(runner, '0.0.0.0', 8080)
    await site.start()
    return await main()

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run())
→ Ссылка