【问题标题】:Deferred is not called sometimes (twisted python)Deferred 有时不被调用(twisted python)
【发布时间】:2013-01-21 07:13:16
【问题描述】:

我已经完成了一个非常简单的网络服务,如下所示:

class UploadResource(Resource):

    def onSuccess(self, result):
        self.request.write("OK")

    def onError(self, result):
        self.request.write("Error")

    def render_POST(self, request):
        request.data.save_to_disk()
        d = request.mirror("http://mirror_replica/Upload")
        d.addCallbacks(self.onSuccess, self.onError)
        return server.NOT_DONE_YET

方法 request.mirror() 返回一个 deferred,它在 http 客户端请求完成将数据发送到同一 Web 服务的另一个副本后触发回调

当我在一些成功的请求后对一个副本运行 /Upload 方法的简单压力测试时,我收到了读取超时客户端异常。 对于 1000 个成功的请求,我有一个读取超时异常。 经过一些调试,我发现有时 onSuccess 回调从未调用 并且读取超时不是由负载过重引起的。

所以,我重写了类代码:

class UploadResource(Resource):

    def render_POST(self, request):
        request.data.save_to_disk()
        d = request.mirror("http://mirror_replica/Upload")

        def onSuccess(result):
            request.write("OK")

        def onError(self, result):
            request.write("Error")

        d.addCallbacks(onSuccess, onError)
        return server.NOT_DONE_YET

现在 onSuccessCallback 总是被调用并且读取超时消失了。

问题是“为什么?”

【问题讨论】:

  • 在您的第一个示例中,self.request 的设置是什么?
  • 像这样: def render_POST(self, request): self.request = request

标签: python twisted deferred


【解决方案1】:

如果您的Deferred 没有被呼叫,那么有人没有呼叫它。这可能是一个错误,也可能只是请求需要很长时间。如果没有看到 mirror 方法的代码,甚至都无法猜测。如果您可以生成complete, runnable example,那将大大有助于诊断您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多