2017-04-20 60 views
0

我有一个应用程序每秒使用一个IOLoop创建100个HTTP请求。请求在10秒后超时。我目前没有对请求的回应进行任何处理。龙卷风:创建多个IOLoops

我注意到的是,程序的内存占用量逐渐增加到1GB内存,直到操作系统终止它为止,这让我认为Python或Tornado没有优化管理内存。

接下来我想尝试的是有多个IOLoops(十个同时运行) - 希望当我停下来关闭一个IOLOOP时,它将有希望释放一些内存,并且我的应用程序可以继续运行。

几个问题:

  1. 请问这种方法有助于释放程序存储器?
  2. 为什么内存 占地面积逐渐增大?
  3. 如何启动多个IOLoops,然后关闭它们?

任何帮助将不胜感激 - 我曾尝试使用进程和线程来管理内存,但迄今为止没有任何效果。

如果它帮助这里是我当前的代码:

import datetime 
from tornado.httpclient import AsyncHTTPClient 
import tornado.ioloop 

PROXIES = [] 

def load_proxies(): 
    """Read proxies from file and store them in PROXIES""" 
    ... 

def test_proxies(): 
    """Test proxies""" 
    global PROXIES 
    print '\nProxy Count: ' + str(len(PROXIES)) + '\n' 
    for proxy in PROXIES: 
     request = tornado.httpclient.HTTPRequest("http://target.com", request_timeout=5) 
     request.proxy_host = proxy['host'] 
     request.proxy_port = proxy['port'] 
     HTTP_CLIENT.fetch(request, handle_response) 
    tornado.ioloop.IOLoop.current().add_timeout(datetime.timedelta(seconds=1), test_proxies) 

def handle_response(response): 
    """Handles response""" 
    try: 
     proxy = {d['host']:d for d in PROXIES}[response.request.proxy_host] 
    except KeyError: 
     return 

    if response.code != 200: 
     PROXIES.remove(proxy) 
    print response.code 

AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient", max_clients=10000) 
HTTP_CLIENT = AsyncHTTPClient() 
load_proxies() 
test_proxies() 
tornado.ioloop.IOLoop.current().start() 

回答

0

我认为这个问题是与您的服务器处理的请求。发生超时时,您是否正确关闭了请求?看看这里:Right way to “timeout” a Request in Tornado如果你发布了至少一部分代码,它会有所帮助。

带有多个IOLoops的解决方案可能会帮助您在多线程的同时处理更多的请求。但是,我不认为它会阻止高内存使用率。

还有就是如何使用多个IOLoops一个很好的说明:Tornado multiple IOLoop in multithreads

+0

我忘了提,这个应用程序是不是服务器是客户端应用程序 – etayluz

+0

@etayluz你可以张贴一些代码? –

+0

当然,我不知道它是否会有所帮助 – etayluz