2017-04-20 3 views
0

J'ai une application qui fait 100 requêtes HTTP chaque seconde en utilisant un seul IOLoop. Les demandes expirent après 10 secondes. Je ne fais aucun traitement avec la réponse de la demande pour le moment. Ce que j'ai remarqué, c'est que l'empreinte mémoire du programme passe graduellement à 1 Go de RAM jusqu'à ce que le système d'exploitation le tue, ce qui m'amène à penser que Python ou Tornado ne gère pas la mémoire de façon optimale. Ce que je voudrais essayer ensuite est d'avoir plusieurs IOLoops (dix en cours d'exécution simultanément) - dans l'espoir que lorsque j'arrêterai et fermerai un IOLOOP, j'espère pouvoir libérer de la mémoire et mon application pourra continuer à fonctionner.tornado: création de plusieurs IOLoops

Peu de questions:

  1. cette approche pourrait-elle aider à libérer la mémoire du programme?
  2. Pourquoi la mémoire empreinte progressivement croissante?
  3. Comment démarrer plusieurs IOLoops, puis les arrêter?

Toute aide serait appréciée - J'ai essayé d'utiliser des processus et des threads pour gérer la mémoire, mais rien n'a encore fonctionné.

Si elle aide voici mon code actuel:

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() 

Répondre

0

Je pense que le problème est avec les requêtes qui traite votre serveur. Fermez-vous les demandes correctement lorsque le délai d'attente se produit? Regardez ici: Right way to “timeout” a Request in Tornado Ça va aider un peu si vous publiez au moins une partie de votre code.

La solution avec plusieurs IOLoops peut vous aider à traiter plus de demandes en même temps en raison du multithreading. Cependant, je ne pense pas que ça va arrêter l'utilisation de la mémoire haute.

Il y a une bonne description de la façon d'utiliser plusieurs IOLoops: Tornado multiple IOLoop in multithreads

+0

j'oublié de mentionner que cette application n'est pas un serveur est une application cliente – etayluz

+0

de @etayluz Pouvez-vous un peu de code? –

+0

Bien sûr, je ne sais pas si ça va aider – etayluz