2010-11-18 5 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 - 내 클립 보드에있는 세 줄의 답을보기 위해 아래로 스크롤합니다. 대신 차를 마시 러 갈거야. – MattH

+0

제 사기를 용서해주십시오. 그러나 어떻게이 결론에 도달 했습니까? 파이썬 명령 줄에서 요청을하면, 아마도 1 밀리 초가 걸릴 것이다. 왜 이것이 문제가 되는가? –

+0

"매우, 매우, 매우 느린"것이 실제로 의미하는 (객관적인 요청/초와 같은) 것을 말하지 않았기 때문에 서버에 어떤 부하가 걸리고 있는지를 말하지 않았으므로 단지 추측입니다. 저는 Twisted의 싱글 스레드 작업 때문에 다른 것보다 오히려이 추측을했습니다. 내 네트워크에서 약 53 밀리 초가 걸립니다. 즉,이 프록시를 실행하면 처리 할 수있는 최대 요청 수는 1000/53 == 18.8이됩니다. 그리고 우리는 요청을 처리하는 다른 비용 (작지만 0이 아닌)을 계산하기 전에입니다. –

관련 문제