2012-07-12 23 views
15

पर गो संगत अनुरोध कैसे करता है मैं Google App Engine पर समवर्ती अनुरोधों को कैसे प्रबंधित करता हूं इस पर थोड़ा उलझन में हूं। तो मुझे उम्मीद है कि कोई कुछ स्पष्टता प्रदान कर सकता है।Google App Engine

यहाँ तथ्यों कि मैं इकट्ठे हुए हैं कर रहे हैं:

  1. जाओ अनुप्रयोग इंजन पर एक लड़ी है। - this is because it is possible to do arbitrary pointer arithmetic by creating race conditions with multiple threads

  2. Goroutines are multiplexed onto multiple OS threads so if one should block, such as while waiting for I/O, others continue to run.

  3. [App Engine has a] 10 concurrent limit [which] is enforced through a limit on concurrent threads on every runtime. Most of such cases, our scheduler will try to spin up a new instance.

तो जाओ अनुप्रयोग इंजन पर एक लड़ी है तो इंगित 3 विवादास्पद है। यह 1 और 2 छोड़ देता है। यदि ऐप इंजन पर जाएं एकल थ्रेड किया गया है और I/O के लिए अवरुद्ध करते समय थ्रेड को निष्पादन जारी रखने की आवश्यकता है, तो ऐसा लगता है कि एक ऐप इंजन गो इंस्टेंस I/O पर प्रतीक्षा करते समय सभी goroutines को अवरुद्ध कर देगा।

क्या यह सही है? यदि नहीं है तो गो की सहमति वास्तव में ऐप इंजन पर कैसे काम करती है?

चीजों को मापने में मदद के लिए। अगर मैं 30 सेकंड के लिए कनेक्शन खोलना चाहता था। एक एई गो उदाहरण कैसे समवर्ती कनेक्शन हो सकता है?

धन्यवाद।

संपादित करें: यहाँ सुविधा का अनुरोध जो पर जाएं उदाहरण की अनुमति देगा और अधिक तो 10 समवर्ती अनुरोध Allow configurable limit of concurrent requests per instance संभाल है। कृपया इसे तारांकित करें।

+7

GOMAXPROCS = 1 सेट करना (यही वह है जो जीएई करता है) का मतलब है कि हमेशा एक सक्रिय धागा होगा जो goroutines निष्पादित करता है। आपके पास अभी भी कुछ अवरुद्ध धागे हो सकते हैं (वे गिनते नहीं हैं)। यह भी ध्यान रखें कि गो लाइब्रेरी पृष्ठभूमि में एपोल का उपयोग करती है, ताकि I/O पूरे धागे को अवरुद्ध करने की संभावना न हो (लेकिन गो में थ्रेड को अवरुद्ध करने के कई अन्य तरीके हैं)। हालांकि मुझे GAE पर सामान्य 10 थ्रेड सीमा के बारे में कुछ भी पता नहीं है। – tux21b

+1

समवर्ती अनुरोध सीमा अब कॉन्फ़िगर करने योग्य है (अधिकतम 80 तक), http://stackoverflow.com/a/37364981/943833 – Roganartu

उत्तर

21

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

आपका कथन "यदि गो ऐप इंजन पर एकल थ्रेड किया गया है तो बिंदु 3 म्यूट है।" गलत है। एक गो गो ऐप इंजन उदाहरण के लिए अभी भी 10 समवर्ती इन-फ्लाइट अनुरोधों की एक सीमा है। दस्तावेज़ "थ्रेड" के बारे में बात करते समय दस्तावेजों के साथ थोड़ा ढीला होता है।

+3

** इस उत्तर को अधिक प्रचार की आवश्यकता है। ** मुझे समझ गया है कि गो रनटाइम कतार अनुरोध है, ताकि आने वाले अनुरोध को तब तक इंतजार करना पड़े जब तक कि वर्तमान अनुरोध पूरी तरह से संसाधित नहीं हो जाता। यह स्पष्ट था कि एक ही अनुरोध कई बार दिनचर्या पैदा कर सकता है और साथ ही साथ काम कर सकता है, लेकिन यह नहीं कि कई लोग दिनचर्या कर सकते हैं। – mjibson

+0

दस्तावेज़ कहते हैं "एकाधिक अनुरोधों को किसी दिए गए उदाहरण द्वारा समवर्ती रूप से संभाला जा सकता है", लेकिन जब तक मैंने इसे अभी तक पढ़ा नहीं है, तब तक मैंने कभी भी अनुच्छेद के माध्यम से इसे कभी नहीं मिला, एकल-थ्रेडेड सीमा पर रोक दिया। – mjibson

+0

धन्यवाद डेविड। मैं अभी भी थ्रॉटलिंग अनुरोध पर थोड़ा अस्पष्ट हूं। मैंने [ताकाशी की प्रतिक्रिया यहां ली] [http://stackoverflow.com/a/11443482/236564) का मतलब यह है कि सभी उदाहरण जहां 10 समवर्ती धागे से सीमित हैं, फिर अनुरोध करते हैं। ऐसा लगता है कि यह हाल ही में बदल सकता है। क्या यह गो के लिए सच नहीं है? यदि यह वास्तव में धागे हैं, तो एफ 1 गो इंस्टेंस संगत अनुरोधों की संख्या के लिए व्यावहारिक सीमा क्या होगी? –

4

मुझे स्वीकार करना होगा कि मेरे पास AppEngine का कोई ज्ञान नहीं है। यह सभी अटकलें और अनुमान है, लेकिन मुझे लगता है कि यह कुछ हद तक उचित है।

आपका ऐप कभी भी दस थ्रेड सीमा तक नहीं पहुंच जाएगा। ऐसा इसलिए है क्योंकि धागे के निर्माण के बहुत कम कारण हैं। सबसे पहले, एक बार में चल रहे goroutines की अधिकतम संख्या एक से enforce memory safety पर सेट है। दूसरा, सामान्य जाने के कार्यक्रम के विपरीत, ऐप इंजन को वास्तव में सिस्को बनाने की आवश्यकता नहीं होती है। नेटवर्किंग के लिए यह एकमात्र समय है। एपेंगिन में सभी आईओ को एक एपोल थ्रेड में जोड़ा जा सकता है। इसका मतलब है कि आपको किसी भी समय किसी भी समय दो धागे की जरूरत है। इसके बाद आप प्रत्येक बार एक बार तीसरे या आगे धागे को जोड़ सकते हैं, जब आपको स्मृति में आवंटित करने और कनेक्शन को स्वीकार करने/बंद करने जैसे अन्य सिस्कोल चलाने की आवश्यकता होती है। ये तेज़ सिस्कोल हैं जो बहुत कम समय के लिए अवरुद्ध होते हैं। इन अन्य syscalls के साथ भी, आप अभी भी दस धागा सीमा से बहुत दूर हैं।

Concurrency प्रभावित नहीं है क्योंकि अंत में, आप जो कुछ भी एपेंगिन में करते हैं, वह नेटवर्क पर वापस आने के लिए कुछ इंतजार कर रहा है। आपको कई चीजों को एक साथ करने के लिए कई धागे की आवश्यकता नहीं है।

+0

धन्यवाद स्टीफन धन्यवाद जो बहुत उपयोगी था। –

+0

@ केलीफिनले, अगर आप उस "एपोल स्टफ" से बहुत परिचित नहीं हैं, तो मुझे क्लासिक ["द सी 10 के समस्या"] (http://www.kegel.com/c10k.html) काम से कम से कम स्किमिंग करने की अत्यधिक सलाह है । – kostix

+0

@ कोस्टिक्स दिलचस्प लेख। धन्यवाद। –