如何使这个Twisted Python代理更快?

时间:2010-11-18 03:34:30

标签: python http proxy twisted

以下代码是内容过滤的HTTP代理。它使用GET将当前站点的URL发送到服务器,在那里它处理它并响应。它运行非常非常非常慢。关于如何加快速度的任何想法?

以下是代码:

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

任何人都对如何让这次跑得更快有任何想法?甚至是更好的写作方式?

1 个答案:

答案 0 :(得分:11)

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

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

普通的基于Twisted的应用程序是单线程的。你必须不遗余力地让线程参与其中。这意味着无论何时请求进入,您都会阻止该HTTP请求中的一个并且仅处理该线程。在此HTTP请求完成之前,不会处理任何其他请求。

尝试使用twisted.web.client中的一个API(例如AgentgetPage)。这些API不会阻止,因此您的服务器将同时处理并发请求。这应该转化为更小的响应时间。