मैं हाल ही में फ्लास्क का उपयोग कर पाइथन में एक पालतू परियोजना पर काम कर रहा हूं। यह एक सरल पेस्टबिन है जिसमें सर्वर-साइड सिंटैक्स पाइगल्स के साथ समर्थन को हाइलाइट करता है। चूंकि यह एक महंगा काम है, इसलिए मैंने एक सेलेरी कार्य कतार में हाइलाइटिंग सिंटैक्स का प्रतिनिधि दिया और अनुरोध हैंडलर में मैं इसे समाप्त करने का इंतजार कर रहा हूं। कहने की जरूरत नहीं है कि यह किसी अन्य कार्यकर्ता को CPU उपयोग को कम करने से अधिक नहीं है, क्योंकि परिणाम के लिए प्रतीक्षा करना अभी भी वेबसर्वर से कनेक्शन को लॉक करता है। मेरी प्रवृत्तियों के बावजूद मुझे प्लेग जैसे समयपूर्व अनुकूलन से बचने के लिए कहा गया है, फिर भी मैं खुद को एसिंक में देखने में मदद नहीं कर सका।पायथन एसिंक और सीपीयू-बाध्य कार्य?
Async
तो हाल ही में अजगर वेब विकास निम्नलिखित किया गया है, तो आप निश्चित रूप से देखा है कि async हर जगह है। एसिंक क्या करता है सहकारी-मल्टीटास्किंग को वापस ला रहा है, जिसका अर्थ है कि प्रत्येक "धागा" तय करता है कि कब और कहां दूसरे को पैदा किया जाए। यह गैर-प्रीपेप्टिव प्रक्रिया ओएस-थ्रेड्स की तुलना में अधिक कुशल है, लेकिन अभी भी इसकी कमी है।
- घटना/कॉलबैक शैली
- coroutines
पहले एक एक घटना पाश में मार डाला शिथिल युग्मित घटकों के माध्यम से संगामिति प्रदान करता है मल्टीटास्किंग: फिलहाल वहाँ 2 प्रमुख दृष्टिकोण होने लगते हैं। हालांकि यह दौड़ की स्थिति के संबंध में सुरक्षित है और अधिक स्थिरता प्रदान करता है, यह प्रीपेप्टिव मल्टीटास्किंग की तुलना में काफी कम सहज और कोड के लिए कठिन है।
दूसरा एक अधिक पारंपरिक समाधान है, थ्रेडेड प्रोग्रामिंग शैली के करीब, प्रोग्रामर को केवल मैन्युअल रूप से संदर्भ स्विच करना पड़ता है। हालांकि दौड़-परिस्थितियों और डेडलॉक्स से अधिक प्रवण होने पर, यह एक आसान ड्रॉप-इन समाधान प्रदान करता है।
इस समय अधिकांश एसिंक कार्य आईओ-बाउंड कार्यों, इनपुट या आउटपुट के लिए प्रतीक्षा करने के लिए ब्लॉक करने वाले कार्यों पर किया जाता है। यह आम तौर पर मतदान और समय-समय पर आधारित कार्यों के उपयोग के माध्यम से पूरा किया जाता है जिसे बुलाया जा सकता है और यदि वे नकारात्मक रूप से वापस आते हैं, तो संदर्भ को स्विच किया जा सकता है।
नाम के बावजूद, इस सीपीयू बाध्य भी कार्य है, जो एक और कार्यकर्ता (धागा, प्रक्रिया, आदि) को प्रत्यायोजित किया जा सकता है और उसके बाद गैर blockingly उपज के लिए के लिए प्रतीक्षा की को लागू किया जा सकता है। आदर्श रूप में, इन कार्यों को एक एसिंक-अनुकूल तरीके से लिखा जाएगा, लेकिन वास्तविकता से यह कोड को अलग-अलग हिस्सों में विभाजित करने का संकेत देगा, जो कि कोड की हर पंक्ति के बाद संदर्भ स्विच को बिना छेड़छाड़ किए। यह मौजूदा सिंक्रोनस पुस्तकालयों के लिए विशेष रूप से असुविधाजनक है।
सुविधा के कारण, मैं async काम के लिए gevent के प्रयोग पर बसे और सोच रहा है कि कैसे एक async वातावरण में सीपीयू बाध्य कार्यों के साथ पेश किया जा रहा है था (वायदा, अजवाइन, आदि का उपयोग?)।
फ्लास्क जैसे पारंपरिक वेब ढांचे के साथ एसिंक निष्पादन मॉडल (इस मामले में gevent) का उपयोग कैसे करें? पाइथन (वायदा, कार्य कतार) में इन समस्याओं के कुछ सामान्य रूप से सहमत समाधान क्या हैं?
संपादित करें: अधिक विशिष्ट होने के लिए - फ्लास्क के साथ गीवेंट का उपयोग कैसे करें और इस संदर्भ में सीपीयू-बाध्य कार्यों से कैसे निपटें?
EDIT2: को ध्यान में रखते कैसे अजगर जीआईएल जो थ्रेडेड कोड के अधिकतम निष्पादन को रोकता है, यह कम से कम केवल बहु विकल्प छोड़ देता है, मेरे मामले में है।इसका मतलब है या तो concurrent.futures या प्रसंस्करण से निपटने वाली कुछ अन्य बाहरी सेवा का उपयोग करना (कुछ भाषा अज्ञेयवादी के लिए दरवाजे खोल सकते हैं) का उपयोग करना। इस मामले में, gevent (i.e. अजवाइन) के साथ कुछ लोकप्रिय या अक्सर उपयोग किए जाने वाले समाधान होंगे? - सर्वोत्तम प्रथाओं
आप इस पैटर्न को लगभग हर पुस्तकालय में अपना सकते हैं: http://bottlepy.org/docs/dev/async.html#event-callbacks। मैं 'सदाबहार' का सुझाव दूंगा, क्योंकि यह 'concurrent.futures' के एक संशोधित संस्करण को एकीकृत करके लंबे समय तक चलने वाले कार्यों के साथ सहकारी कार्यों (ग्रीनलेट्स) को संयोजित करने की अनुमति देता है। – schlamar