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