因此,我尝试使用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})
我希望虽然所示方法无法完成工作,但我应该能够从客户端调用其他方法并获得响应。
答案 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})