代码之家  ›  专栏  ›  技术社区  ›  Eino Gourdin

龙卷风-如何在连接关闭时停止所有异步“等待”

  •  0
  • Eino Gourdin  · 技术社区  · 6 年前

    所以我在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 !")
    

    除了一件事:如果客户机终止连接,处理程序会继续等待等待等待的任何事件。

    当客户机关闭连接时,会调用在连接关闭时找到的;那么我可以从这个函数调用什么来“中断”等待中的主处理程序?有没有办法提出类似例外的问题?

        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”会立即显示,但“信号灯已释放!”只有在非常长的超时后才显示。

    事先谢谢!

    1 回复  |  直到 6 年前
        1
  •  2
  •   xyres    6 年前

    你需要跟踪未来。然后在 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('')