【问题标题】:RuntimeError: this event loop is already runningRuntimeError:此事件循环已在运行
【发布时间】:2018-12-07 04:24:02
【问题描述】:

我正在尝试使用以下代码在 sanic 中运行异步第 3 方文件上传

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)

这就是我从路由中调用请求的方式。

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

但是,它返回 RuntimeError:此事件循环已在运行。错误

【问题讨论】:

    标签: python-3.x asynchronous flask async-await sanic


    【解决方案1】:

    这是在 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多