【问题标题】:How to make this Twisted Python Proxy faster?如何让这个 Twisted Python 代理更快?
【发布时间】:2023-12-05 07:30:01
【问题描述】:

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

有人对如何使这个运行更快有任何想法吗?或者更好的写法?

【问题讨论】:

  • 对不起,听起来您只是在说服务器响应缓慢。我错过了什么?
  • 是的,我是。它运行得非常、非常、非常慢。我正在想办法让它跑得更快。我一直在谷歌搜索,但到目前为止还没有。我想我会把它贴在这里看看是否有其他人知道更好的方法。我会使用其他库或模块来编写它,但 Twisted 是我唯一能找到文档和示例的。
  • 您愿意接受答案吗? :)

标签: python http proxy twisted


【解决方案1】:

这个代理速度慢的主要原因可能是这三行:

    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 - 向下滚动以查看剪贴板上这三行的答案。我去给自己泡杯茶吧。
  • 请原谅我的无知,但是你是怎么得出这个结论的?当我从 Python 命令行发出请求时,可能需要一毫秒......为什么会出现这个问题?
  • 这只是一个猜测,因为你没有说“非常、非常、非常慢”实际上是什么意思(客观地说,比如请求/秒),你也没有说你的负载是什么'正在申请服务器。由于 Twisted 的单线程操作,我做出了这个猜测而不是另一个猜测。在我的网络中,大约需要 53 毫秒。这意味着如果我运行这个代理,它可以处理的最多请求/秒将是 1000 / 53 == 18.8。那是在我们计算处理请求的其他成本之前(这些成本很小,但不为零)。
  • 哇,所以你认为我只需要找到另一种方法来编写这个阻塞代理,而不需要 Twisted?
  • 您所说的“阻止”就像“限制对内容的访问”一样。我说的是“阻塞”,就像“暂停线程的执行直到结果可用”一样。它们是非常不同的东西。 :) 您可以使用基于 Twisted 的代理来阻止内容,但您必须这样做而不暂停执行以等待结果。
最近更新 更多