python - 从 Sanic 函数调用抛出“asyncio.run() 不能从正在运行的事件循环中调用”
问题描述
我是异步的新手。试图创建一个用于阻塞 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
@singletonAsyncMaker
def sleeper(obj):
sleep(2)
return obj
x = 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)
尝试将异步添加到 sanicfunction_name
定义并在调用之前等待,但没有运气。sleeper()
我知道 sanic 与 asyncio 一起工作,这是否有助于此?任何修复或解决方法?
解决方案
无需asyncio.run
在 Sanic 内部打电话。
@app.route("/v0/xxxxxxxxxxxxxxx", methods=['POST'])
async def function_name(request):
await call_to_some_coroutine()
推荐阅读
- laravel - 未能按升序在赛普拉斯上以秒为单位比较日期
- java - 是否可以从类路径外部给出步骤定义文件,即来自文件系统
- python - 尝试用 Python 制作闹钟,但它不起作用
- visual-studio-code - vscode 代码扩展 java 测试运行器既不显示消息也不显示堆栈跟踪
- reactjs - swiper.updateSize()/swiper.update() 不工作 swiperjs React
- git - 源树 - 可以“将 master 重置为此提交”恢复推送的提交吗?
- javascript - 如何将请求 js 中的 post 请求转换为包含流参数的 get js
- prolog - 递归遍历两个列表并组合测试
- r - 如何用系列制作R中的条形图?
- javascript - 当某些字母发生变化时,如何在复数中找到单数?最好的方法是什么?