代码之家  ›  专栏  ›  技术社区  ›  Matthew Scouten

Twisted.web。如果客户端取消了连接,服务器不会通知

  •  0
  • Matthew Scouten  · 技术社区  · 7 年前

    documentation 意味着 Deferred request.notifyFinish() 如果连接因任何原因中断,应通知。我在下面加载了类似的代码:

    from twisted.web.resource import Resource
    from twisted.web.server import NOT_DONE_YET
    from twisted.internet import reactor
    from twisted.logger import Logger
    
    log = Logger()
    
    class DelayedResource(Resource):
        isLeaf = 1
    
        def _delayedRender(self, request):
            log.info("Rendered!")
            request.write("<html><body>Sorry to keep you waiting.</body></html>")
            request.finish()
    
        def _responseFailed(self, err, call):
            call.cancel()
            log.info("No. Wait. Stop")
    
        def render_GET(self, request):
            log.info("Lets try this!")
            call = reactor.callLater(5, self._delayedRender, request)
            request.notifyFinish().addErrback(self._responseFailed, call)
            return NOT_DONE_YET
    

    _responseFailed 不会被呼叫。日志语句“No.Wait.Stop”从不打印,而“Rendered!”陈述

    这很重要,因为在我的实际用例中,如果连接中断,我正在分配需要释放的资源。升级到twisted 17.1.0后,这些停止了清理。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jean-Paul Calderone    7 年前

    这是由于一个bug(或意外引入的功能-由你来判断!)介绍人 http://tm.tl/8320 但最近由 http://tm.tl/8692 notifyFinish() Failure (尽管它似乎仍在燃烧 成功 notifyFinish() 失败 在HTTP客户端观察到某种错误的情况下。请记住这一点,并确保必须在请求结束时进行的任何处理都不依赖于 关于这个 Deferred (即,附上 或者确保处理作为响应生成代码的一部分运行)。