2010-11-18 22 views
5

Aşağıdaki kod, içerik filtreleme için bir HTTP proxy'dir. Mevcut sitenin URL'sini sunucuya gönderdiği ve işlediği ve yanıt verdiği GET'i kullanır. VERY, ÇOK, ÇOK yavaş çalışır. Daha hızlı nasıl yapılacağı hakkında bir fikrin var mı?Bu Twisted Python Proxy nasıl daha hızlı yapılır?

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

Herkes daha hızlı bu çalışmasını sağlamak için nasıl bir fikrin var: Burada

kodudur? Ya da yazmanın daha iyi bir yolu?

+0

Üzgünüm, sadece sunucunun yanıt vermekte yavaş olduğunu söylüyorsunuz. Neyi kaçırıyorum? – mjhm

+0

Evet, öyleyim. ÇOK, ÇOK, ÇOK yavaş çalışır. Daha hızlı çalışmasını sağlamak için bir yol bulmaya çalışıyorum. Googling oldum ama şu ana kadar hiçbir şey yok. Başka birinin daha iyi bir yol bildiğini görmek için buraya yollayacağımı düşündüm. Diğer kütüphaneleri veya modülleri kullanarak yazabilirim, ancak Twisted, dokümanlar ve örnekler bulabildiğim tek şey. –

+0

Cevabı kabul etmek ister misiniz? :) –

cevap

11

bu proxy içinde yavaşlık ana nedeni muhtemelen bu üç satır:

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

Normal Twisted tabanlı bir uygulama dişli bekar. Konuyla ilgilenmek için yoldan çıkmalısın. Bu, bir istek geldiğinde, bu HTTP isteğindeki bir ve yalnızca işlem iş parçacığını engellediğiniz anlamına gelir. Bu HTTP isteği tamamlanana kadar başka istekte bulunulmaz.

Twisted.web.client içinde API'lerden birini kullanmayı deneyin (ör. Agent veya getPage). Bu API'ler engellenmez, böylece sunucunuz eşzamanlı olarak eşzamanlı istekleri ele alır. Bu çok daha küçük tepki sürelerine dönüşmelidir.

+1

+1 - Panodaki üç çizgiyle cevaplara bakmak için aşağı kaydırın. Gidip kendime bir fincan çay yapacağım. – MattH

+0

Lütfen cehaletimi bağışlayın, ama bu sonuca nasıl geldiniz? Python komut satırından istek yaptığımda, belki bir milisaniye sürer .... bu neden sorun olur? –

+0

Sadece bir tahmindir, çünkü "ÇOK, ÇOK, ÇOK yavaş" ifadesinin aslında (istekte/saniye gibi nesnel anlamda) anlamına gelmediğinden ve sunucuya hangi yükü uyguladığınızı söylemediniz. Twisted'in tek iş parçacıklı operasyonu yüzünden bu tahminini bir diğerinden çok yaptım. Ağımdan yaklaşık 53 milisaniye sürüyor. Bu, bu vekili çalıştırdığımda, halledebileceği en çok istek/saniye 1000/53 = 18.8 olacaktır. Ve bu, talebi ele almanın diğer maliyetlerini hesaba katmadan önce (ki bunlar küçük ama sıfır olmayan). –

İlgili konular