Итак, у меня в 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.
Заранее спасибо!