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:
- cette approche pourrait-elle aider à libérer la mémoire du programme?
- Pourquoi la mémoire empreinte progressivement croissante?
- 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()
j'oublié de mentionner que cette application n'est pas un serveur est une application cliente – etayluz
de @etayluz Pouvez-vous un peu de code? –
Bien sûr, je ne sais pas si ça va aider – etayluz