Aiohttp: сервер и клиент за один раз - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь использовать aiohttp 3.6.2 как сервер, так и клиент: Для webhook выполните работу:

1) Получите JSON -запрос из службы 2) Быстрая отправка HTTP 200 OK обратно в службу 3) Сделано дополнительная работа после: сделать http-запрос на медленный веб-сервис (ответ 2-5 se c)

Я не понимаю, как выполнить работу после того, как представление (или обработчик) вернуло web.Response (text = " OK ")?

Текущее представление: (оно медленное, потому что медленный http_request выполняется до ответа) view.py:


async def make_http_request(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            print(await resp.text())

async def work_on_request(request):
    url = (await request.json())['url']
    await make_http_request(url)
    return aiohttp.web.Response(text='all ok')

rout.py:

from views import work_on_request

def setup_routes(app):
    app.router.add_get('/', work_on_request)

сервер .py:

from aiohttp import web
from routes import setup_routes
import asyncio


app = web.Application()
setup_routes(app)
web.run_app(app)

Итак, обходной путь для меня - запустить еще один поток с другим event_l oop, или, может быть, вы знаете, как добавить какую-то работу к текущему событию l oop?

1 Ответ

0 голосов
/ 17 апреля 2020

Уже не актуально, потому что я нашел решение добавить еще одну задачу в main event_l oop: // дополнительно я создал одну глобальную очередь для взаимодействия сопрограмм между собой.

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
queue = asyncio.Queue(maxsize=100000)

loop.create_task(worker('Worker1', queue))
app = web.Application()
app['global_queue'] = queue
...