2010-11-18 30 views
5

El siguiente código es un proxy HTTP para el filtrado de contenido. Utiliza GET para enviar la URL del sitio actual al servidor, donde lo procesa y responde. Funciona MUY, MUY, MUY lento. ¿Alguna idea sobre cómo hacerlo más rápido?¿Cómo hacer que este Twisted Python Proxy sea más rápido?

Aquí está el código:

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

Alguien tiene alguna idea sobre cómo hacer que este funcione más rápido? O incluso una mejor manera de escribirlo?

+0

Lo siento, parece que solo dice que el servidor responde lentamente. ¿Qué me estoy perdiendo? – mjhm

+0

Sí, lo soy. Corre MUY, MUY, MUY lento. Estoy tratando de encontrar la forma de hacerlo funcionar más rápido. He estado buscando en Google, pero nada tan lejos. Pensé que lo publicaría aquí para ver si alguien más sabía una mejor manera. Lo escribiría utilizando otras bibliotecas o módulos, pero Twisted es el único en el que podría encontrar documentos y ejemplos. –

+0

¿Desea aceptar la respuesta? :) –

Respuesta

11

La principal causa de la lentitud en este proxy es probablemente estas tres líneas:

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

Una aplicación basada en Twisted normal es de un solo subproceso. Tienes que salir de tu camino para involucrar a los hilos. Esto significa que cada vez que se recibe una solicitud, está bloqueando el único hilo de procesamiento en esta solicitud HTTP. No se procesan más solicitudes hasta que se complete esta solicitud HTTP.

Intente utilizar una de las API en twisted.web.client, (por ejemplo, Agent o getPage). Estas API no se bloquean, por lo que su servidor manejará las solicitudes concurrentes al mismo tiempo. Esto debería traducirse en tiempos de respuesta mucho más pequeños.

+1

+1 - Se desplazó hacia abajo para ver las respuestas con esas tres líneas en mi portapapeles. Voy a hacerme una taza de té en su lugar. – MattH

+0

Disculpe mi ignorancia, pero ¿cómo llegó a esta conclusión? Cuando realizo la solicitud desde la línea de comando de Python, lleva quizás un milisegundo ... ¿por qué sería este el problema? –

+0

Es solo una suposición, ya que no dijiste qué significa "MUY, MUY, MUY lento" en realidad (en términos objetivos, como solicitudes/segundo), y no dijiste qué carga estás aplicando al servidor. Hice esta suposición en lugar de otra debido a la operación de un solo subproceso de Twisted. Desde mi red, toma alrededor de 53 milisegundos. Eso significa que si ejecuté este proxy, la mayoría de las solicitudes/segundo que podría manejar serían 1000/53 == 18.8. Y eso es antes de contar los otros costos de manejo de la solicitud (que son pequeños, pero no son cero). –

Cuestiones relacionadas