0

因此,我尝试使用 Sanic 来处理一些异步 Web 请求,因为我有一些特殊的请求需要几秒钟才能返回,但同时希望从客户端执行其他请求。这是一个示例方法,它在等待 lib.getAlarmState() 返回时似乎仍在阻止来自客户端的其他调用。(lib.getAlartmState() 是使用 pythons ctypes 调用 C 库,需要大约 3 秒才能返回并返回 Int 类型。)

根据我在 sanic 文档中看到的内容,只需将方法定义为 async 就可以满足我的要求吗?我试过在 lib.getAlarmState() 前面添加一个等待,但我不确定我使用的是否正确。

@app.route('/processjson')
async def processjson(request):

    vals = lib.getAlarmState()

    return response.json({"alarm:" : vals})

我希望在显示的方法停止运行时,我应该能够从客户端调用其他方法并获得响应。

4

1 回答 1

1

那是对的。Sanic 将无法将阻塞调用转换为异步调用。也许,您可以尝试在单独的任务中运行它。

async def get_alarm_state_wrapper():
    return lib.getAlarmState()

@app.route('/processjson')
async def processjson(request):

    vals = await asyncio.gather(get_alarm_state_wrapper())

    return response.json({"alarm:" : vals})
于 2019-06-06T18:51:03.880 回答