Memory leaks 使用tornado作为代理,内存泄漏,don';我不知道为什么?
我想使用tornado作为代理服务器。事情很简单: 1.接收某个客户的请求 2.从请求中获取url、参数和标题 3.使用代理对第2部分中的内容进行请求 4.将响应内容、标题和代理返回给客户端 代码如下:Memory leaks 使用tornado作为代理,内存泄漏,don';我不知道为什么?,memory-leaks,proxy,tornado,Memory Leaks,Proxy,Tornado,我想使用tornado作为代理服务器。事情很简单: 1.接收某个客户的请求 2.从请求中获取url、参数和标题 3.使用代理对第2部分中的内容进行请求 4.将响应内容、标题和代理返回给客户端 代码如下: # -*- coding: utf-8 -*- import json import functools import base64 import sys from tornado.httpserver import HTTPServer from tornado.ioloop import
# -*- coding: utf-8 -*-
import json
import functools
import base64
import sys
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.httpclient import AsyncHTTPClient
import tornado.web
import util
AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")
class MainHandler(tornado.web.RequestHandler):
def handle_response(self, proxy, response):
if response.error:
self.write("error")
else:
headers = {name.lower(): value for name, value in response.headers.get_all()}
result = {
"content": base64.b64encode(response.body),
"headers": headers,
"proxy": proxy,
}
self.write(json.dumps(result))
self.finish()
@tornado.web.asynchronous
def post(self):
url = self.get_argument("url", "")
body = self.get_argument("body", "")
headers = json.loads(self.get_argument("headers", ""))
method = self.get_argument("method", "GET")
proxy = self.get_argument("proxy", "")
client = AsyncHTTPClient()
if proxy == "":
proxy = util.get_random_ip() # get a proxy string, like '118.150.101.160:18088'
proxy_info = proxy.split(":")
request_info = {
"method": method,
"headers": headers,
"connect_timeout": 2,
"request_timeout": 5,
"proxy_host": proxy_info[0],
"proxy_port": int(proxy_info[1]),
}
cf = functools.partial(self.handle_response, proxy)
if method == "POST":
request_info["body"] = body
client.fetch(url, callback=cf, **request_info)
if __name__ == "__main__":
port = sys.argv[1]
print "start at port : ", port
application = tornado.web.Application([(r"/proxy", MainHandler)])
server = HTTPServer(application)
server.listen(int(port))
IOLoop.instance().start()
当请求增长到大约每分钟300次(5/s不太高)时,内存开始出错。我用“扫视”来检查系统信息,一开始,使用的内存是16.6M,但3分钟后,内存增加到107.8M,10分钟后,数字可能会达到8518.6M,这太可怕了
我不知道为什么,有什么帮助吗