Как сделать этот Twisted Python Proxy быстрее? - PullRequest
5 голосов
/ 18 ноября 2010

Приведенный ниже код является 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 голосов
/ 18 ноября 2010

Основная причина медлительности в этом прокси-сервере, вероятно, следующие три строки:

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

Обычное приложение на основе Twisted является однопоточным. Вы должны стараться изо всех сил вовлекать темы. Это означает, что всякий раз, когда поступает запрос, вы блокируете единственный поток обработки этого HTTP-запроса. Никакие дальнейшие запросы не обрабатываются до тех пор, пока этот HTTP-запрос не будет завершен.

Попробуйте использовать один из API-интерфейсов в twisted.web.client (например, Агент или getPage ). Эти API не блокируются, поэтому ваш сервер будет обрабатывать параллельные запросы одновременно. Это должно привести к гораздо меньшему времени отклика.

...