Торнадо - Как остановить все асинхронные ожидания от on_connection_close - PullRequest
0 голосов
/ 07 февраля 2019

Итак, у меня в Tornado есть асинхронный обработчик запросов, который ожидает каких-то событий, после чего он что-то пишет клиенту и завершает работу.

По сути это примерно так:

async def post(self, request_url):
    await my_semaphore.acquire()
        try:
            with await my_redis_pool as redis:
                redis_value = await redis.brpop("my_value", timeout=very_long_timeout)
            self.write(value)
    finally:
        my_semaphore.release()
        print("The semaphore is released !")

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

Я обнаружил, что on_connection_close вызывается, когда клиент закрывает соединение;так что я могу вызвать из этой функции, чтобы "вырвать" основной обработчик из ожидания?Есть ли способ вызвать что-то, похожее на исключение?

    def on_connection_close(self):
        print("on_connection_close")
        # what could I do here to interrupt whatever the post() method is awaiting

Я пытался вызвать raise tornado.web.HTTPError(504) из on_connection_close, но это не работает."on_connection_close" отображается немедленно, но "Семафор освобожден!"отображается только после very_long_timeout.

Заранее спасибо!

1 Ответ

0 голосов
/ 07 февраля 2019

Вам нужно следить за будущим.И тогда в on_connection_close вы можете установить пустой результат на будущее.Это переместит сопрограмму вперед.

self.redis_value_future = redis.brpop("my_value", timeout=very_long_timeout)
redis_value = await self.redis_value_future

И затем установите пустой результат, подобный этому:

def on_connection_close(self):
    self.redis_value_future.set_result('')
...