0

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

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 服务的另一个副本

当我在一些成功请求后对一个副本运行 /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总是被调用并且读取超时消失了。

问题是“为什么?”

4

1 回答 1

1

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

于 2013-01-21T18:57:08.037 回答