2010-11-18 80 views
5

以下代碼是用於內容過濾的HTTP代理。它使用GET將當前網站的URL發送到服務器,在那裏處理它並作出響應。它運行非常,非常,非常很慢。有關如何使其更快的任何想法?如何使這個Twisted Python Proxy更快?

下面是代碼:

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

人對如何使這個運行速度更快的任何想法?或甚至更好的方式來寫它?

+0

對不起,這聽起來像你只是說服務器響應緩慢。我錯過了什麼? – mjhm 2010-11-18 04:12:47

+0

是的,我是。它運行非常非常非常緩慢。我試圖找出一種讓它跑得更快的方法。我一直在谷歌搜索,但沒有到目前爲止。我想我會在這裏發佈,看看是否有其他人知道更好的方法。我會使用其他庫或模塊編寫它,但Twisted是我能找到的唯一文檔和示例。 – 2010-11-18 04:25:34

+0

你想接受答案嗎? :) – 2011-04-19 17:07:31

回答

11

在此代理緩慢的主要原因可能是以下三行:

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

正常的基於扭曲的應用程序是單線程的。你必須走出自己的方式來涉足線程。這意味着每當有請求進入時,您都會阻止此HTTP請求上唯一的處理線程。在這個HTTP請求完成之前,不會處理進一步的請求。

嘗試使用twisted.web.client中的API之一(例如AgentgetPage)。這些API不會阻塞,因此您的服務器將同時處理併發請求。這應該轉化爲更小的響應時間。

+1

+1 - 向下滾動查看剪貼板上這三行的答案。我會去替自己沏一杯茶。 – MattH 2010-11-18 09:52:45

+0

請原諒我的無知,但你是如何得出這個結論的?當我從Python命令行發出請求時,它可能需要一毫秒......爲什麼會出現這種問題? – 2010-11-21 00:36:33

+0

這只是一個猜測,因爲你沒有說什麼「非常,非常,非常慢」實際上意味着(以客觀條件,如請求/秒),並且你沒有說出你應用到服務器的負載。由於Twisted的單線程操作,我做了這個猜測而不是另一個。在我的網絡中,大約需要53毫秒。這意味着如果我運行這個代理,它可以處理的最多請求數/秒將是1000/53 == 18.8。這是在我們計算處理請求的其他成本之前(它們很小,但非零)。 – 2010-11-21 04:00:04