2014-06-08 8 views
6

अनुरोध संचालकों इस प्रकार हैं:अजगर तूफान - अतुल्यकालिक अनुरोध ब्लॉक कर रहा है

class TestHandler(tornado.web.RequestHandler): # localhost:8888/test 
    @tornado.web.asynchronous 
    def get(self): 
     t = threading.Thread(target = self.newThread) 
     t.start() 

    def newThread(self): 
     print "new thread called, sleeping" 
     time.sleep(10) 
     self.write("Awake after 10 seconds!") 
     self.finish() 

class IndexHandler(tornado.web.RequestHandler):   # localhost:8888/ 
    def get(self): 
     self.write("It is not blocked!") 
     self.finish() 

जब मैं localhost:8888/test, पृष्ठ लोड 10 सेकंड प्राप्त और Awake after 10 seconds पता चलता है; जबकि यह लोड हो रहा है, अगर मैं एक नए ब्राउज़र टैब में localhost:8888/index खोलता हूं, तो नया इंडेक्स पेज अवरुद्ध नहीं होता है और तुरंत लोड होता है। ये मेरी उम्मीद फिट बैठता है।

हालांकि, /test लोड हो रहा है, अगर मैं एक नया ब्राउज़र टैब में /test खोलता हूं, तो यह अवरुद्ध है। दूसरा /test केवल समाप्त होने के बाद ही प्रसंस्करण शुरू होता है।

मैंने यहां क्या गलतियां की हैं?

उत्तर

6

जो आप देख रहे हैं वह वास्तव में ब्राउज़र सीमा है, न कि आपके कोड के साथ कोई समस्या नहीं। मैं बनाने के लिए अपने TestHandler को कुछ अतिरिक्त लॉगिंग जोड़ा यह स्पष्ट:

Thread starting 1402236952.17 
new thread called, sleeping 1402236952.17 
Thread starting 1402236953.21 
new thread called, sleeping 1402236953.21 

और इस पर:

class TestHandler(tornado.web.RequestHandler): # localhost:8888/test 
    @tornado.web.asynchronous 
    def get(self): 
     print "Thread starting %s" % time.time() 
     t = threading.Thread(target = self.newThread) 
     t.start() 

    def newThread(self): 
     print "new thread called, sleeping %s" % time.time() 
     time.sleep(10) 
     self.write("Awake after 10 seconds!" % time.time()) 
     self.finish() 

अगर मैं स्थानीय होस्ट करने के लिए/परीक्षण एक साथ दो कर्ल सत्र खोलते हैं, तो मैं सर्वर साइड पर इस मिल ग्राहक पक्ष:

Awake after 10 seconds! 1402236962.18 
Awake after 10 seconds! 1402236963.22 

जो आप अपेक्षा करते हैं वही है। हालांकि क्रोमियम में, मुझे आपके जैसा ही व्यवहार मिलता है। मुझे लगता है कि क्रोमियम (शायद सभी ब्राउज़र्स) एक ही यूआरएल में एक बार खोले जाने के लिए एक कनेक्शन की अनुमति देगा। मैंने IndexHandler को TestHandler के समान कोड चलाने के द्वारा कुछ अलग लॉग संदेशों को छोड़कर इसकी पुष्टि की।

index Thread starting 1402237590.03 
index new thread called, sleeping 1402237590.03 
Thread starting 1402237592.19 
new thread called, sleeping 1402237592.19 

आप देख सकते हैं दोनों मुद्दे के बिना समवर्ती भाग गया: यहाँ उत्पादन जब दो ब्राउज़र विंडो, /test करने के लिए एक, और एक /index को खोलने है।

+0

मुझे विश्वास नहीं है कि यह ब्राउज़र की समस्या है .... मैंने पूरे दिन मुझे यह पता लगाने की कोशिश की कि क्या हुआ !! बहुत बहुत धन्यवाद! –

+0

यह मुझे एक घंटे के लिए पागल कर रहा था। – xyres

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