2013-02-13 9 views
5

मैं gunicorn और उसके async श्रमिकों का उपयोग कर लंबी चलने वाली अनुरोध का उत्तर देने के लिए कोशिश कर रहा हूँ की प्रक्रिया नहीं है, लेकिन मैं किसी भी उदाहरण है कि मैं काम करने के लिए प्राप्त कर सकते हैं नहीं मिल रहा। मैं उदाहरण here थे, लेकिन प्रतिक्रिया लौटने से पहले एक नकली देरी (5s के लिए नींद) जोड़ने के लिए बदलाव:gunicorn समकालिक अनुरोधों समवर्ती

def app(environ, start_response): 
    data = "Hello, World!\n" 
    start_response("200 OK", [ 
     ("Content-Type", "text/plain"), 
     ("Content-Length", str(len(data))) 
    ]) 
    time.sleep(5) 
    return iter([data]) 

तब मैं gunicorn तो चलाएँ:

gunicorn -w 4 myapp:app -k gevent

जब मैं दो ब्राउज़र को खोलने के टैब और http://127.0.0.1:8000/ में दोनों को टाइप करें और लगभग एक ही समय में अनुरोध भेजें, अनुरोध अनुक्रमिक रूप से - 5 सेकंड के बाद एक रिटर्न और के बाद अन्य रिटर्न 5 सेकंड।

प्रश्न: मैं नींद अनुमान लगा रहा हूँ अनुकूल gevent नहीं है? लेकिन 4 कर्मचारी हैं और इसलिए यदि कार्यकर्ता का प्रकार 'सिंक' था तो दो श्रमिकों को एक साथ दो अनुरोधों को संभालना चाहिए?

+0

क्या आपको समाधान मिला? –

+0

क्षमा करें, मैंने नहीं किया। – swoop81

उत्तर

5

मैं सिर्फ एक ही बात में भाग, यहाँ एक सवाल खोला: Requests not being distributed across gunicorn workers। नतीजा यह है कि ऐसा लगता है कि ब्राउजर एक ही पृष्ठ तक पहुंच को क्रमबद्ध करता है। मैं शायद अनुमान है कि इस w/cacheability कुछ करने के लिए है, यानी ब्राउज़र सोचता है कि यह पेज संचित करने योग्य है की संभावना है है, जब तक यह लोड करता है पता चल गया कि यह तो यह एक और अनुरोध और इतने पर बनाता है नहीं है प्रतीक्षा करें।

+0

तो कष्टप्रद और बहुत आसान ... :( – jwg

+0

धन्यवाद @CrazyCasta। मैंने एक और ब्राउज़र स्थापित करके और दो अलग-अलग ब्राउज़रों (क्रोमियम और फ़ायरफ़ॉक्स) से अनुरोध भेजकर अपना जवाब सत्यापित कर लिया है, और अनुरोध समानांतर में सर्विस किए जाते हैं। – swoop81

0

gevent.sleep एक शॉट के बजाय time.sleep दे।

यह अजीब बात है कि यह -w 4 के साथ हो रहा है, लेकिन -k gevent एक एसिंक कार्यकर्ता प्रकार है, इसलिए यह संभव है कि गनिकोर्न एक ही ग्राहक को दोनों अनुरोधों को खिला रहा हो। मान लीजिए कि क्या हो रहा है, time.sleep आपकी प्रक्रिया को तब तक लॉक कर देगा जब तक कि आप gevent.monkey.patch_all() का उपयोग न करें।

1

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

एसिंक कार्यकर्ता उपयोगी होता है जब आपका वर्कलोड हल्का होता है, और अनुरोध दर तेज होती है, उस मामले में, बंदूकधारक आईओ इंतजार पर बर्बाद समय का उपयोग कर सकता है (जैसे, सॉकेट को प्रतिक्रिया लिखने के लिए लिखने के लिए प्रतीक्षा करना) , किसी अन्य कार्यकर्ता को दूसरे अनुरोध पर काम करने के लिए स्विच करके। एक ही कार्यकर्ता को सौंपा गया एक अन्य अनुरोध पर स्विच करके

अद्यतन

मैं गलत था।

गैर-अवरुद्ध कार्यकर्ता प्रकार के साथ बंदूक का उपयोग करते समय, बंदूकधारी में कार्यकर्ता सेटिंग्स के साथ, प्रत्येक कार्यकर्ता एक प्रक्रिया है, जो एक अलग कतार चलाता है।

तो time.sleep विभिन्न प्रक्रियाओं पर चलाया गया था, तो यह एक साथ चल जाएगा, लेकिन जब यह एक ही कार्यकर्ता में चलाया जाता है, तो यह अनुक्रमिक रूप से किया जाएगा।

समस्या यह है कि बंदूकधारक लोडबैंसर ने दो कार्यकर्ता प्रक्रियाओं में दो अनुरोध वितरित नहीं किए हैं। आप वर्तमान प्रक्रिया को os.getpid() द्वारा देख सकते हैं।

+0

गनिकोर्न उल्लेख के लिए धन्यवाद यह संख्या आप '-w' ध्वज के रूप में निर्दिष्ट का उपयोग करता –

+0

@ ron.rothman यही सच है मेरे स्पष्टीकरण गलत है,; केवल एक ही प्रक्रिया अनुरोधों को हैंडल करने का उपयोग नहीं करता है।!। – tdihp

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