为了账号安全,请及时绑定邮箱和手机立即绑定

从 Sanic 函数调用会抛出“无法从正在运行的事件循环调用 asyncio.run()”

从 Sanic 函数调用会抛出“无法从正在运行的事件循环调用 asyncio.run()”

繁星点点滴滴 2023-08-08 18:03:55
我是异步新手。尝试创建一个异步装饰器来阻塞 I/O 代码。def singletonAsyncMaker(func):    async def inner(obj, ):        loop = asyncio.get_event_loop()        tasks = (loop.run_in_executor(None, func, i) for i in obj)        return await asyncio.gather(*tasks)    def main(obj):        return asyncio.run(inner(obj))    return main@singletonAsyncMakerdef sleeper(obj):    sleep(2)    return objx = sleeper([8, 5, 6, 6, 4645, 63, 4, 6, 1, 64, 614, 24, 65, ])print(x)这通常运行良好,并且在正常的非异步函数中也运行良好,但是当通过 Sanic 服务器的路由函数调用时,它会抛出此错误。Traceback (most recent call last):  File "/app.py", line 99, in extractImageResponse    result = perform_textract_bytestream(images)  File "async_experiment.py", line 51, in main    return asyncio.run(inner(obj))  File "env/lib/python3.8/asyncio/runners.py", line 33, in run    raise RuntimeError(RuntimeError: asyncio.run() cannot be called from a running event loop@app.route("/v0/xxxxxxxxxxxxxxx", methods=['POST'])def function_name(request):    -----------------    x = sleeper(list)    -----------------    return jsonify(json_op)尝试将async添加到 sanicfunction_name定义并在调用之前等待sleeper(),但没有成功。我知道 sanic 可以与 asyncio 一起使用,这对此有帮助吗?有什么修复或解决方法吗?
查看完整描述

1 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

无需asyncio.run在 Sanic 内部调用。


@app.route("/v0/xxxxxxxxxxxxxxx", methods=['POST'])

async def function_name(request):

    await call_to_some_coroutine()


查看完整回答
反对 回复 2023-08-08
  • 1 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信