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

5 投票
1 回答
2170 浏览
提问于 2025-04-16 07:15

下面的代码是一个用于内容过滤的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 个回答

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,比如Agent或者getPage。这些API不会阻塞,这样你的服务器就能同时处理多个请求。这应该能大大缩短响应时间。

撰写回答