2010-11-18 7 views
5

以下のコードはコンテンツフィルタリング用のHTTPプロキシです。 GETを使用して現在のサイトのURLをサーバーに送信し、サーバーが処理して応答します。それは実行するVERY,VERY,VERY slowです。それをより速くする方法に関するアイデア?ここで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

+0

はい、ありがとうございます。それは非常に、非常に、非常に遅く実行されます。私はそれをより速く走らせる方法を見つけようとしています。私はグーグルをしてきましたが、それまでは何もありませんでした。他の誰かがもっと良い方法を知っているかどうかを知るために私はここにそれを掲示すると考えました。私はそれを他のライブラリやモジュールを使って書くつもりですが、Twistedだけがドキュメントや例を見つけることができます。 –

+0

答えを受け入れますか? :) –

答えて

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のいずれかを使用してください(例:AgentまたはgetPage)。これらのAPIはブロックされないため、サーバーは同時リクエストを同時に処理します。これにより、応答時間が大幅に短縮されます。

+1

+1 - 下にスクロールして、クリップボード上の3行の回答を確認します。私は代わりにお茶を1杯作ります。 – MattH

+0

私の無知を許してください。しかし、どうやってこの結論に来ましたか?私がPythonのコマンドラインから要求を出すと、ミリ秒かかるかもしれません....なぜこれが問題になるのでしょうか? –

+0

「非常に、非常に遅い」というのは実際には(客観的な意味でリクエスト/秒のような)実際には何を意味するのか、あなたはサーバーにどのような負荷をかけているのかは言わなかったからです。私はTwistedのシングルスレッド操作のために、この推測を別のものよりもむしろ行いました。私のネットワークからは約53ミリ秒かかります。これは、このプロキシを実行した場合、1秒あたりに要求できるリクエスト数が1000/53 == 18.8になることを意味します。そしてそれは、リクエストを処理する他のコスト(小さいがゼロではない)を計算する前です。 –

関連する問題