2010-11-18 16 views
5

नीचे दिए गए कोड सामग्री फ़िल्टरिंग के लिए एक HTTP प्रॉक्सी है। यह सर्वर पर वर्तमान साइट का यूआरएल भेजने के लिए जीईटी का उपयोग करता है, जहां यह इसे संसाधित करता है और जवाब देता है। यह बहुत, बहुत, बहुत धीमा है। इसे कैसे तेजी से बनाने के बारे में कोई विचार?इस ट्विस्ट पायथन प्रॉक्सी को तेज़ी से कैसे बनाया जाए?

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

किसी को भी यह कैसे रन तेजी से बनाने के लिए पर कोई विचार है:

यहाँ कोड है? या इसे लिखने का एक बेहतर तरीका भी?

+0

मुझे खेद है, ऐसा लगता है कि आप बस इतना कह रहे हैं कि सर्वर प्रतिक्रिया देने में धीमा है। मैं क्या खो रहा हूँ? – mjhm

+0

हाँ, मैं हूं। यह बहुत, बहुत धीमी गति से चलाता है। मैं इसे तेजी से चलाने के लिए एक रास्ता समझने की कोशिश कर रहा हूं। मैं गुगल रहा हूं, लेकिन अभी तक कुछ भी नहीं। मैंने सोचा कि मैं यह देखने के लिए यहां पोस्ट करूंगा कि कोई और बेहतर तरीके से जानता है या नहीं। मैं इसे अन्य पुस्तकालयों या मॉड्यूल का उपयोग करके लिखूंगा, लेकिन ट्विस्ट केवल एक ही है जिसे मैं दस्तावेज़ और उदाहरण देख सकता हूं। –

+0

क्या आप उत्तर स्वीकार करना चाहते हैं? :) –

उत्तर

11

इस प्रॉक्सी में सुस्ती का मुख्य कारण शायद इन तीन लाइनों है:

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

एक सामान्य मुड़ आधारित अनुप्रयोग एकल लड़ी है। धागे को शामिल करने के लिए आपको अपने रास्ते से बाहर जाना होगा। इसका मतलब है कि जब भी कोई अनुरोध आता है, तो आप इस HTTP अनुरोध पर एक और केवल प्रोसेसिंग थ्रेड को अवरुद्ध कर रहे हैं। इस HTTP अनुरोध को पूरा होने तक कोई और अनुरोध संसाधित नहीं किया जाता है।

twisted.web.client में एपीआई में से किसी एक का उपयोग करने का प्रयास करें, (उदाहरण के लिए Agent या getPage)। ये एपीआई ब्लॉक नहीं करते हैं, इसलिए आपका सर्वर समवर्ती अनुरोधों को एक साथ संभाल लेगा। इसे बहुत कम प्रतिक्रिया समय में अनुवाद करना चाहिए।

+1

+1 - मेरे क्लिपबोर्ड पर उन तीन पंक्तियों के साथ उत्तरों को देखने के लिए नीचे स्क्रॉल किया गया। मैं खुद को एक कप चाय बना दूंगा। – MattH

+0

कृपया मेरी अज्ञानता को क्षमा करें, लेकिन आप इस निष्कर्ष पर कैसे आए? जब मैं पायथन कमांड लाइन से अनुरोध करता हूं, तो शायद यह एक मिलीसेकंड लेता है .... यह समस्या क्यों होगी? –

+0

यह सिर्फ एक अनुमान है, क्योंकि आपने यह नहीं कहा था कि "बहुत, बहुत, बहुत धीमी" वास्तव में क्या है (उद्देश्य शब्दों में, अनुरोध/सेकंड की तरह), और आपने यह नहीं कहा कि आप सर्वर पर कितना लोड कर रहे हैं। मैंने ट्विस्टेड सिंगल थ्रेडेड ऑपरेशन की वजह से यह अनुमान लगाया। मेरे नेटवर्क से, इसमें लगभग 53 मिलीसेकंड लगते हैं। इसका मतलब है कि अगर मैं इस प्रॉक्सी को चलाता हूं, तो सबसे अधिक अनुरोध/दूसरा इसे कभी भी संभाला जा सकता है 1000/53 == 18.8। और इससे पहले कि हम अनुरोध को संभालने की अन्य लागतों को गिनें (जो छोटे हैं, लेकिन गैर-शून्य हैं)। –

संबंधित मुद्दे