Ich habe ein Setup, wo Tornado als eine Art Pass-through für Arbeiter verwendet wird. Die Anfrage wird von Tornado empfangen, die diese Anfrage an N Worker sendet, Ergebnisse aggregiert und sie an den Client zurücksendet. Was funktioniert gut, außer wenn aus irgendeinem Grund Timeout auftritt — dann habe ich Speicherverlust.Tornado Speicherleck auf fallengelassenen Verbindungen
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()
Was mache ich falsch:
Ich habe ein Setup, die ähnlich wie diese Pseudo-Code erhalten? Woher kommt das Speicherleck?
Ich mag das nicht 'wenn len (Antworten) == len (Arbeiter): '- Sind Sie sicher, dass die Anwendung immer hier ankommt? Versuchen Sie, Versuche zu protokollieren, um einen Stapel von Anfragen und erfolgreichen Versuchen zu erstellen. –
@Nikolay: Recht, AFAIK, verwendet Tornado einen Rückruf sowohl für Erfolg und Fehler. Daher bin ich mir ziemlich sicher, dass unabhängig davon, wie viele Mitarbeiter versagt haben, immer so viele Antworten eingehen. Ich bin mir nicht sicher, was passiert, wenn der Kunde die Anfrage storniert. – vartec
Auch wenn Sie mehr als 10 Arbeiter haben, und alle sterben durch Timeout - Sie haben Zeit, wenn Tornado keine neue Verbindung erstellen kann - ich weiß nicht, wie es sich in diesem Moment verhält. Versuchen Sie, mit dem Argument max_clients zu spielen. –