2010-11-18 11 views
5

Der folgende Code ist ein HTTP-Proxy für die Inhaltsfilterung. Er verwendet GET, um die URL der aktuellen Site an den Server zu senden, wo er sie verarbeitet und antwortet. Es läuft SEHR, SEHR, SEHR langsam. Irgendwelche Ideen, wie man es schneller machen kann? HierWie mache ich diesen Twisted Python Proxy schneller?

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

Wer irgendwelche Ideen, wie diese laufen schneller zu machen? Oder sogar eine bessere Art, es zu schreiben?

+0

Es tut mir leid, es klingt wie Sie nur sagen, dass der Server ist langsam zu reagieren. Was vermisse ich? – mjhm

+0

Ja, ich bin. Es läuft sehr, sehr, sehr langsam. Ich versuche einen Weg zu finden, um es schneller laufen zu lassen. Ich habe gegoogelt, aber bis jetzt noch nichts. Ich dachte, ich würde es hier posten, um zu sehen, ob jemand anders einen besseren Weg kennt. Ich würde es mit anderen Bibliotheken oder Modulen schreiben, aber Twisted ist das einzige, auf dem ich Dokumente und Beispiele finden konnte. –

+0

Möchten Sie die Antwort akzeptieren? :) –

Antwort

11

Die Hauptursache der Langsamkeit in diesem Proxy ist wahrscheinlich diese drei Linien:

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

Eine normale Twisted-basierte Anwendung Gewinde Single. Sie müssen aus dem Weg gehen, um Threads einzubeziehen. Das bedeutet, dass immer wenn eine Anfrage eingeht, Sie den einzigen Verarbeitungsthread für diese HTTP-Anfrage blockieren. Bis zum Abschluss dieser HTTP-Anfrage werden keine weiteren Anfragen bearbeitet. Verwenden Sie eine der APIs in twisted.web.client (z. B. Agent oder getPage). Diese APIs blockieren nicht, sodass Ihr Server gleichzeitige Anfragen gleichzeitig verarbeitet. Dies sollte zu viel kleineren Antwortzeiten führen.

+1

+1 - Scrollte hinunter, um die Antworten mit diesen drei Zeilen in meiner Zwischenablage zu betrachten. Ich werde mir stattdessen eine Tasse Tee machen. – MattH

+0

Bitte verzeihen Sie meine Ignoranz, aber wie sind Sie zu dieser Schlussfolgerung gekommen? Wenn ich die Anfrage von der Python-Kommandozeile aus mache, dauert es vielleicht eine Millisekunde .... warum wäre das das Problem? –

+0

Es ist nur eine Vermutung, da Sie nicht gesagt haben, was "SEHR, SEHR, SEHR langsam" eigentlich bedeutet (in objektiven Begriffen wie Anfragen/Sekunde), und Sie nicht gesagt haben, welche Last Sie auf den Server anwenden. Wegen Twisted's single-threaded Operation habe ich diese Vermutung eher als eine andere gemacht. Von meinem Netzwerk dauert es etwa 53 Millisekunden. Das bedeutet, dass, wenn ich diesen Proxy ausführte, die meisten Anfragen/Sekunde, die er jemals bearbeiten könnte, 1000/53 == 18,8 wären. Und das ist bevor wir die anderen Kosten der Bearbeitung der Anfrage zählen (die klein, aber nicht Null sind). –

Verwandte Themen