0

I try to use aiohttp 3.6.2 both server and client: For webhook perform work:

1) Get JSON-request from service 2) Fast send HTTP 200 OK back to service 3) Made additional work after: make http-request to slow web-service(answer 2-5 sec)

I dont understand how to perform work after view(or handler) returned web.Response(text="OK")?

Current view: (it's slow cause slow http_request perform before response) 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')

routes.py:

from views import work_on_request

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

server.py:

from aiohttp import web
from routes import setup_routes
import asyncio


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

So, workaround for me is to start one more thread with different event_loop, or may be you know how to add some work to current event loop?

1 Answers1

0

Already not actual, cause i found desicion to add one more task to main event_loop: //additionaly i created one global queue to interoperate coroutine between each other.

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