延迟不称为有时(扭曲的python)

时间:2013-01-21 07:13:17

标签: python twisted deferred

我做了一个非常简单的网络服务:

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()返回在http客户端请求完成将数据发送到同一Web服务的另一个副本后触发的延迟

当我在一些成功的请求之后对一个副本运行简单的压力测试/上传方法时,我得到了一个读取超时客户端异常。 对于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总是被称为,并且读取超时已经消失。

问题是“为什么?”

1 个答案:

答案 0 :(得分:1)

如果您的Deferred未被呼叫,则有人无法呼叫它。这可能是一个错误,或者可能只是请求需要很长时间。如果没有看到mirror方法的代码,甚至无法猜测。如果你能够产生complete, runnable example,那么在诊断你的问题方面会有很长的路要走。