如何让Twisted Python代理更快?

5
下面的代码是用于内容过滤的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()

有没有任何想法可以让这个运行更快?或者有更好的编写方式吗?


对不起,听起来你只是在说服务器响应慢。我错过了什么吗? - mjhm
是的,我正在使用它。它运行得非常、非常、非常慢。我正在尝试找出一种使它运行更快的方法。我已经在谷歌上搜索了很多,但目前还没有找到。我想在这里发布它,看看是否有其他人知道更好的方法。我可以使用其他库或模块来编写它,但Twisted是我能找到文档和示例的唯一选择。 - Zac Brown
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之一(例如AgentgetPage)。这些API不会阻塞,因此您的服务器将同时处理并发请求。这应该可以转化为更小的响应时间。

1
+1 - 我滚动查看了剪贴板上的这三行答案。我去泡杯茶,稍后再看。 - MattH
请原谅我的无知,但是你是怎么得出这个结论的?当我在Python命令行中发出请求时,可能只需要一毫秒...为什么会有问题呢? - Zac Brown
哇,你认为我只需要找到另一种不使用Twisted的方式来编写这个阻塞代理吗? - Zac Brown
但是,使用代理的目的是为了阻止。它必须阻止。我会检查Agent和getPage。 - Zac Brown
5
您说的“blocking”是指“限制访问内容”。我所指的“blocking”是指“暂停线程执行,直到结果可用”。它们非常不同。 :) 您可以使用基于Twisted的代理阻止内容,但必须在等待结果时不暂停执行。 - Jean-Paul Calderone
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接