RuntimeError: this event loop is already running

2019-01-20 17:30发布

问题:

I am trying to run an asynchronous 3rd party file upload using the following code in sanic

def up(self,request):
    import asyncio

    import aiohttp

    header = {
        'Authorization': 'Client-ID {}'.format(self.client_id)
    }

    data = {
        'image': open("/home/jibin/Downloads/test.jpg", "rb")
    }

    async def upload(data):

        async with aiohttp.ClientSession() as session:
            async with  session.post(self.url, headers=header,data=data) as resp:
                data = await resp.text()
                print(data)


    futures = []

    futures.append(upload(data))

    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(futures))
    loop.close()

    return response.json("done",status=200)

this is how I call the request from the route.

@app.route('/upload', methods=['POST'])
async def upload(request):
    return up(request)

However, it returns RuntimeError: this event loop is already running. error

回答1:

Here is the code that worked for me in sanic

@app.route('/upload')
async def get_ressource(request):
    asyncio.ensure_future(blocking_function())
    return await resp()

async def blocking_function():
    async with aiohttp.ClientSession() as session:
        async with session.post("your_url", data={
            'image': open("file_path", "rb"),
        }, headers={
            'Authorization': 'Client-ID {}'.format("your_client_id")
        }) as resp:
            result = await resp.text()
    print(result)


async def resp():
    return response.json("OK", status=202)