Отложенный иногда не вызывается (витой питон)

Я сделал довольно простой веб-сервис вроде этого:

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-клиента завершил отправку данных в другую реплику той же веб-службы.

Когда я запустил простой стресс-тест для метода / 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 всегда вызывается, и тайм-аут чтения пропал.

Вопрос: «Почему?»


person user1996215    schedule 21.01.2013    source источник
comment
В вашем первом примере какой параметр self.request?   -  person Amber    schedule 21.01.2013
comment
вот так: def render_POST (self, request): self.request = request   -  person user1996215    schedule 06.05.2013


Ответы (1)


Если вашему Deferred не звонят, значит, кто-то не звонит. Это может быть ошибка или просто запрос занимает много времени. Не видя кода метода mirror, действительно невозможно даже догадаться. Если бы вы могли создать полный, работоспособный пример, это имело бы большое значение для диагностики вашей проблемы.

person Glyph    schedule 21.01.2013