2010-11-18 18 views
5

Poniższy kod jest proxy HTTP do filtrowania treści. Używa polecenia GET do wysyłania adresu URL bieżącej witryny do serwera, gdzie przetwarza ją i odpowiada. Działa VERY, BARDZO, BARDZO wolno. Wszelkie pomysły, jak przyspieszyć działanie?Jak przyspieszyć ten Twisted Python Proxy?

Oto kod:

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

Ktoś ma jakieś pomysły, jak zrobić to biegać szybciej? A może nawet lepszy sposób na napisanie?

+0

Przykro mi, wygląda na to, że po prostu mówisz, że serwer nie odpowiada. Czego mi brakuje? – mjhm

+0

Tak, jestem. Działa bardzo, bardzo, bardzo wolno. Próbuję wymyślić sposób, aby działał szybciej. Byłem Googlingiem, ale nic tak daleko. Pomyślałem, że opublikuję tutaj, żeby sprawdzić, czy ktoś inny zna lepszy sposób. Napisałbym to przy użyciu innych bibliotek lub modułów, ale Twisted jest jedynym, w którym mogę znaleźć dokumenty i przykłady. –

+0

Czy chcesz zaakceptować odpowiedź? :) –

Odpowiedz

11

Główną przyczyną powolność tego proxy prawdopodobnie tych dwóch linii

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

Normalny skręcone oparte jest zastosowanie pojedynczego gwintowanego. Musisz zejść z siebie, aby włączyć wątki. Oznacza to, że za każdym razem, gdy przychodzi żądanie, blokujesz jeden i jedyny wątek przetwarzania na tym żądaniu HTTP. Żadne dalsze żądania nie zostaną przetworzone do czasu zakończenia tego żądania HTTP.

Spróbuj użyć jednego z interfejsów API w twisted.web.client (np. Agent lub getPage). Te interfejsy API nie blokują, więc serwer będzie obsługiwać jednocześnie równoczesne żądania. To powinno przełożyć się na znacznie krótszy czas reakcji.

+1

+1 - Przewiń w dół, aby zobaczyć odpowiedzi z tymi trzema liniami w moim schowku. Pójdę zrobić sobie filiżankę herbaty. – MattH

+0

Proszę, wybacz mi moją ignorancję, ale jak doszło do tego wniosku? Kiedy zgłoszę żądanie z wiersza poleceń Pythona, może minąć milisekunda ... dlaczego to byłby problem? –

+0

To tylko domysły, ponieważ nie powiedziałeś, co oznacza "BARDZO, BARDZO, BARDZO wolno" (w kategoriach obiektywnych, takich jak żądania/sekunda), i nie powiedziałeś, jaki ładunek chcesz zastosować na serwerze. Zrobiłem to zgadywanie, a nie inne, z powodu pojedynczej operacji Twisted. Z mojej sieci zajmuje to około 53 milisekund. Oznacza to, że jeśli uruchomię to proxy, najwięcej żądań/sekund, które mogłyby obsłużyć, będzie wynosić 1000/53 == 18,8. I to już zanim policzymy inne koszty obsługi żądania (które są małe, ale niezerowe). –