amol rane
amol rane

Reputation: 335

not able to make async request using aiohttp

I have following python api function which takes some time to give output. its api endpoint is abc/abcd. when i hit that api endpoint simultaneously from multiple ip's it does not give next output till previous request is not complete. I am using aiohttp. I api should answer many requests at the same time

async def Logistic(request):
    container_id = request.query['container_id']
    company = request.query['company']
    data = mysqlcon("SELECT date,moves,location,vessel,voyage,current_status FROM container_status WHERE date_current in (SELECT max(date_current) FROM container_status) and company_id={0}".format(container_id),"rpa")
    a = {"Result":[]}
    if data == ():
        pass
    else:
        for i in data:
            a["Result"].append(i)
    return web.Response(text=json.dumps(a),headers={'ACCESS-CONTROL-ALLOW-ORIGIN':'*'})

Upvotes: 1

Views: 178

Answers (1)

Andrew Svetlov
Andrew Svetlov

Reputation: 17386

Please move all database access code (SELECT ... execution and iteration over returned result) into a separate function and run it in thread pool:

def sync_db_request(container_id):
    data = mysqlcon("SELECT date,moves,location,vessel,voyage,current_status FROM container_status WHERE date_current in (SELECT max(date_current) FROM container_status) and company_id={0}".format(container_id),"rpa")
    a = {"Result":[]}
    if data == ():
        pass
    else:
        for i in data:
            a["Result"].append(i)
    return a

async def Logistic(request):
    container_id = request.query['container_id']
    company = request.query['company']
    a = await request.loop.run_in_executor(None, sync_db_request, container_id)
    return web.Response(text=json.dumps(a),headers={'ACCESS-CONTROL-ALLOW-ORIGIN':'*'})

Upvotes: 2

Related Questions