У меня есть настройка, где Tornado используется как проход для рабочих. Запрос получен от Tornado, который отправляет этот запрос N работникам, агрегирует результаты и отправляет их клиенту. Что отлично работает, за исключением случаев, когда по какой-то причине происходит тайм-аут. то у меня утечка памяти.
У меня есть настройка, которая похожа на этот псевдокод:
workers = ["http://worker1.example.com:1234/",
           "http://worker2.example.com:1234/", 
           "http://worker3.example.com:1234/" ...]
class MyHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def post(self):
        responses = []
        def __callback(response):
            responses.append(response)
            if len(responses) == len(workers):
                self._finish_req(responses)
        for url in workers:
            async_client = tornado.httpclient.AsyncHTTPClient()
            request = tornado.httpclient.HTTPRequest(url, method=self.request.method, body=body)
            async_client.fetch(request, __callback) 
    def _finish_req(self, responses):
        good_responses = [r for r in responses if not r.error]
        if not good_responses:
            raise tornado.web.HTTPError(500, "\n".join(str(r.error) for r in responses))
        results = aggregate_results(good_responses)
        self.set_header("Content-Type", "application/json")
        self.write(json.dumps(results))
        self.finish()
application = tornado.web.Application([
    (r"/", MyHandler),
])
if __name__ == "__main__":
    ##.. some locking code 
    application.listen()
    tornado.ioloop.IOLoop.instance().start()
Что я делаю неправильно? Откуда возникает утечка памяти?
