Проблема с асинхронными (не блокирующими) методами в Sanic - PullRequest
0 голосов
/ 06 июня 2019

Таким образом, я пытаюсь использовать Sanic для некоторых асинхронных веб-запросов, поскольку у меня есть некоторые специальные, которые возвращаются назад за несколько секунд, но в то же время хотят выполнять другие запросы от клиента. Вот пример метода, который, похоже, по-прежнему блокирует другие вызовы от клиента, ожидая возвращения lib.getAlarmState (). (lib.getAlartmState () - это вызов библиотеки C с использованием pythons ctypes, который возвращает около 3 секунд и возвращает тип Int.)

Согласно тому, что я вижу в документации для sanic, простое определение метода как async должно делать то, что я ищу? Я попытался добавить await перед lib.getAlarmState (), но я не уверен, что я использую это совершенно правильно.

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

    vals = lib.getAlarmState()

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

Я ожидаю, что пока показанный метод не работает, я должен иметь возможность вызывать другие методы от клиента и получать ответы.

1 Ответ

0 голосов
/ 06 июня 2019

Это правильно.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})
...