मुझे एक ऐसा सेटअप मिला है जहां टॉरनाडो का उपयोग श्रमिकों के लिए पास-थ्रू के प्रकार के रूप में किया जाता है। टोरनाडो द्वारा अनुरोध प्राप्त किया जाता है, जो एन कार्यकर्ताओं को यह अनुरोध भेजता है, परिणाम एकत्र करता है और इसे वापस ग्राहक को भेजता है। जो ठीक काम करता है, सिवाय इसके कि जब किसी कारण से टाइमआउट — होता है तो मुझे स्मृति रिसाव मिल गया है।गिराए गए कनेक्शन पर टोरनाडो मेमोरी रिसाव
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()
क्या मैं गलत कर रहा हूँ:
मैं जो इस स्यूडोकोड के लिए इसी तरह एक सेटअप मिल गया है? मेमोरी लीक कहां से आती है?
मुझे यह पसंद नहीं है 'अगर लेन (प्रतिक्रियाएं) == लेन (श्रमिक):' - क्या आप सुनिश्चित हैं कि एप्लिकेशन हमेशा यहां मिलता है? अनुरोधों और सफल प्रयासों के बैच बनाने के प्रयासों को लॉग करने का प्रयास करें। –
@ निकोले: दाएं, AFAIK, टोरनाडो सफलता और त्रुटि दोनों के लिए कॉलबैक का उपयोग करता है। इस प्रकार मुझे पूरा यकीन है कि कितने श्रमिक असफल रहे हैं, इस पर ध्यान दिए बिना, यह हमेशा कई प्रतिक्रियाएं प्राप्त करता है। मुझे यकीन नहीं है कि क्या होता है, जब ग्राहक अनुरोध रद्द कर देता है। – vartec
यदि आपके पास 10 से अधिक कर्मचारी हैं, और वे सभी समय-समय पर मर जाते हैं - आपके पास समय अवधि है जब टर्ननाडो नया कनेक्शन नहीं बना सकता - मुझे नहीं पता कि यह इस समय कैसा व्यवहार करता है। 'Max_clients' तर्क के साथ खेलने का प्रयास करें। –