2010-11-18 32 views
5

Mã bên dưới là proxy HTTP để lọc nội dung. Nó sử dụng GET để gửi URL của trang web hiện tại đến máy chủ, nơi nó xử lý nó và phản hồi. Nó chạy VERY, VERY, VERY chậm. Bất kỳ ý tưởng về cách làm cho nó nhanh hơn?Làm thế nào để làm cho Proxy Python xoắn nhanh hơn?

Đây là mã:

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

Bất cứ ai có bất cứ ý tưởng về cách làm cho hoạt động này nhanh hơn? Hoặc thậm chí là một cách tốt hơn để viết nó?

+0

Tôi xin lỗi, có vẻ như bạn đang nói rằng máy chủ phản hồi chậm. Tôi đang thiếu gì? – mjhm

+0

Có, tôi. Nó chạy RẤT, RẤT, RẤT chậm. Tôi đang cố gắng tìm ra cách để nó chạy nhanh hơn. Tôi đã được Googling, nhưng không có gì cho đến nay. Tôi nghĩ tôi sẽ đăng nó ở đây để xem liệu có ai biết cách nào tốt hơn không. Tôi sẽ viết nó bằng cách sử dụng các thư viện hoặc mô-đun khác, nhưng Twisted là người duy nhất tôi có thể tìm thấy tài liệu và các ví dụ trên. –

+0

Bạn có muốn chấp nhận câu trả lời không? :) –

Trả lời

11

Nguyên nhân chính của sự chậm chạp trong proxy này có lẽ là ba dòng:

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

Một ứng dụng Twisted dựa trên bình thường là đơn ren. Bạn phải đi ra khỏi con đường của bạn để có được chủ đề liên quan. Điều đó có nghĩa là bất cứ khi nào có yêu cầu đến, bạn đang chặn một và chỉ xử lý luồng trên yêu cầu HTTP này. Không có yêu cầu nào khác được xử lý cho đến khi yêu cầu HTTP này hoàn tất.

Hãy thử sử dụng một trong các API ở dạng xoắn.ebient, (ví dụ: Agent hoặc getPage). Các API này không chặn, vì vậy máy chủ của bạn sẽ xử lý đồng thời các yêu cầu đồng thời. Điều này sẽ chuyển thành thời gian phản hồi nhỏ hơn nhiều.

+1

+1 - Cuộn xuống để xem câu trả lời với ba dòng đó trên khay nhớ tạm của tôi. Tôi sẽ tự làm một tách trà. – MattH

+0

Xin hãy tha thứ cho sự thiếu hiểu biết của tôi, nhưng làm cách nào bạn đi đến kết luận này? Khi tôi thực hiện yêu cầu từ dòng lệnh Python, có thể mất một phần nghìn giây .... tại sao đây lại là vấn đề? –

+0

Nó chỉ là một đoán, vì bạn đã không nói những gì "RẤT, RẤT, RẤT chậm" thực sự có nghĩa là (trong điều kiện khách quan, như yêu cầu/thứ hai), và bạn không nói những gì tải bạn đang áp dụng cho máy chủ. Tôi đã thực hiện dự đoán này hơn là khác vì hoạt động đơn luồng của Twisted. Từ mạng của tôi, mất khoảng 53 mili giây. Điều đó có nghĩa rằng nếu tôi chạy proxy này, hầu hết các yêu cầu/giây nó có thể xử lý sẽ là 1000/53 == 18.8. Và đó là trước khi chúng tôi tính các chi phí khác để xử lý yêu cầu (đó là nhỏ, nhưng khác không). –

Các vấn đề liên quan