Sanic的异步(非阻塞)方法出现问题

时间:2019-06-06 17:22:20

标签: python asynchronous python-asyncio sanic

因此,我尝试使用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})

我希望虽然所示方法无法完成工作,但我应该能够从客户端调用其他方法并获得响应。

1 个答案:

答案 0 :(得分:0)

是正确的。 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})