2010-11-18 14 views
5

Le code ci-dessous est un proxy HTTP pour le filtrage de contenu. Il utilise GET pour envoyer l'URL du site actuel au serveur, où il le traite et répond. Il fonctionne TRÈS, TRÈS, TRÈS lent. Des idées sur la façon de le rendre plus rapide?Comment rendre ce Twisted Python Proxy plus rapide?

Voici le code:

from twisted.internet import reactor 
from twisted.web import http 
from twisted.web.proxy import Proxy, ProxyRequest 
from Tkinter import * 
#import win32api 
import urllib2 
import urllib 
import os 
import webbrowser 

cwd = os.path.abspath(sys.argv[0])[0] 
proxies = {} 
user = "zachb" 
class BlockingProxyRequest(ProxyRequest): 
    def process(self): 
     params = {} 
     params['Location']= self.uri 
     params['User'] = user 
     params = urllib.urlencode(params) 
     req = urllib.urlopen("http://weblock.zbrowntechnology.info/ProgFiles/stats.php?%s" % params, proxies=proxies) 
     resp = req.read() 
     req.close() 
     if resp == "allow": 
      pass 
     else: 
      self.transport.write('''BLOCKED BY ADMIN!''') 
      self.transport.loseConnection() 

     ProxyRequest.process(self) 

class BlockingProxy(Proxy): 
    requestFactory = BlockingProxyRequest 
factory = http.HTTPFactory() 
factory.protocol = BlockingProxy 

reactor.listenTCP(8000, factory) 
reactor.run() 

Quelqu'un a des idées sur la façon de faire de cette course plus rapide? Ou même une meilleure façon de l'écrire?

+0

Je suis désolé, il semble que vous disiez simplement que le serveur tarde à répondre. Qu'est-ce que je rate? – mjhm

+0

Oui, je suis. Il court très, très, très lent. J'essaie de trouver un moyen de le faire fonctionner plus vite. J'ai été googling, mais rien pour l'instant. Je me suis dit que je l'afficherais ici pour voir si quelqu'un d'autre savait mieux. Je l'écrirais en utilisant d'autres bibliothèques ou modules, mais Twisted est le seul sur lequel je pourrais trouver des docs et des exemples. –

+0

Voulez-vous accepter la réponse? :) –

Répondre

11

La principale cause de la lenteur de cette procuration est probablement ces trois lignes:

req = urllib.urlopen("http://weblock.zbrowntechnology.info/ProgFiles/stats.php?%s" % params, proxies=proxies) 
    resp = req.read() 
    req.close() 

Une application torsadée normale est un seul thread. Vous devez sortir de votre chemin pour obtenir des discussions. Cela signifie qu'à chaque fois qu'une requête arrive, vous bloquez le seul et unique thread de traitement de cette requête HTTP. Aucune autre demande n'est traitée jusqu'à la fin de cette requête HTTP. Essayez d'utiliser l'une des API dans twisted.web.client (par exemple Agent ou getPage). Ces API ne bloquent pas, de sorte que votre serveur gère simultanément les demandes simultanées. Cela devrait se traduire par des temps de réponse beaucoup plus courts.

+1

+1 - Faites défiler vers le bas pour regarder les réponses avec ces trois lignes sur mon presse-papiers. Je vais aller me faire une tasse de thé à la place. – MattH

+0

S'il vous plaît pardonnez mon ignorance, mais comment êtes-vous arrivé à cette conclusion? Quand je fais la demande à partir de la ligne de commande Python, cela prend peut-être une milliseconde .... pourquoi serait-ce le problème? –

+0

C'est juste une supposition, puisque vous n'avez pas dit ce que "TRÈS, TRÈS lent, TRÈS lent" signifie (en termes objectifs, comme les demandes/seconde), et vous n'avez pas dit quelle charge vous appliquez au serveur. J'ai fait cette supposition plutôt qu'une autre à cause de l'opération monothread de Twisted. De mon réseau, cela prend environ 53 millisecondes. Cela signifie que si je courais ce proxy, le plus grand nombre de demandes/seconde qu'il pourrait jamais gérer serait 1000/53 == 18.8. Et c'est avant que nous comptons les autres coûts de traitement de la demande (qui sont petits, mais non nul). –