2013-04-12 11 views
11

मैं हाल ही में फ्लास्क का उपयोग कर पाइथन में एक पालतू परियोजना पर काम कर रहा हूं। यह एक सरल पेस्टबिन है जिसमें सर्वर-साइड सिंटैक्स पाइगल्स के साथ समर्थन को हाइलाइट करता है। चूंकि यह एक महंगा काम है, इसलिए मैंने एक सेलेरी कार्य कतार में हाइलाइटिंग सिंटैक्स का प्रतिनिधि दिया और अनुरोध हैंडलर में मैं इसे समाप्त करने का इंतजार कर रहा हूं। कहने की जरूरत नहीं है कि यह किसी अन्य कार्यकर्ता को CPU उपयोग को कम करने से अधिक नहीं है, क्योंकि परिणाम के लिए प्रतीक्षा करना अभी भी वेबसर्वर से कनेक्शन को लॉक करता है। मेरी प्रवृत्तियों के बावजूद मुझे प्लेग जैसे समयपूर्व अनुकूलन से बचने के लिए कहा गया है, फिर भी मैं खुद को एसिंक में देखने में मदद नहीं कर सका।पायथन एसिंक और सीपीयू-बाध्य कार्य?

Async

तो हाल ही में अजगर वेब विकास निम्नलिखित किया गया है, तो आप निश्चित रूप से देखा है कि async हर जगह है। एसिंक क्या करता है सहकारी-मल्टीटास्किंग को वापस ला रहा है, जिसका अर्थ है कि प्रत्येक "धागा" तय करता है कि कब और कहां दूसरे को पैदा किया जाए। यह गैर-प्रीपेप्टिव प्रक्रिया ओएस-थ्रेड्स की तुलना में अधिक कुशल है, लेकिन अभी भी इसकी कमी है।

  • घटना/कॉलबैक शैली
  • coroutines

पहले एक एक घटना पाश में मार डाला शिथिल युग्मित घटकों के माध्यम से संगामिति प्रदान करता है मल्टीटास्किंग: फिलहाल वहाँ 2 प्रमुख दृष्टिकोण होने लगते हैं। हालांकि यह दौड़ की स्थिति के संबंध में सुरक्षित है और अधिक स्थिरता प्रदान करता है, यह प्रीपेप्टिव मल्टीटास्किंग की तुलना में काफी कम सहज और कोड के लिए कठिन है।

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

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

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


सुविधा के कारण, मैं async काम के लिए gevent के प्रयोग पर बसे और सोच रहा है कि कैसे एक async वातावरण में सीपीयू बाध्य कार्यों के साथ पेश किया जा रहा है था (वायदा, अजवाइन, आदि का उपयोग?)।

फ्लास्क जैसे पारंपरिक वेब ढांचे के साथ एसिंक निष्पादन मॉडल (इस मामले में gevent) का उपयोग कैसे करें? पाइथन (वायदा, कार्य कतार) में इन समस्याओं के कुछ सामान्य रूप से सहमत समाधान क्या हैं?

संपादित करें: अधिक विशिष्ट होने के लिए - फ्लास्क के साथ गीवेंट का उपयोग कैसे करें और इस संदर्भ में सीपीयू-बाध्य कार्यों से कैसे निपटें?

EDIT2: को ध्यान में रखते कैसे अजगर जीआईएल जो थ्रेडेड कोड के अधिकतम निष्पादन को रोकता है, यह कम से कम केवल बहु विकल्प छोड़ देता है, मेरे मामले में है।इसका मतलब है या तो concurrent.futures या प्रसंस्करण से निपटने वाली कुछ अन्य बाहरी सेवा का उपयोग करना (कुछ भाषा अज्ञेयवादी के लिए दरवाजे खोल सकते हैं) का उपयोग करना। इस मामले में, gevent (i.e. अजवाइन) के साथ कुछ लोकप्रिय या अक्सर उपयोग किए जाने वाले समाधान होंगे? - सर्वोत्तम प्रथाओं

+0

आप इस पैटर्न को लगभग हर पुस्तकालय में अपना सकते हैं: http://bottlepy.org/docs/dev/async.html#event-callbacks। मैं 'सदाबहार' का सुझाव दूंगा, क्योंकि यह 'concurrent.futures' के एक संशोधित संस्करण को एकीकृत करके लंबे समय तक चलने वाले कार्यों के साथ सहकारी कार्यों (ग्रीनलेट्स) को संयोजित करने की अनुमति देता है। – schlamar

उत्तर

6

यह अतुल्यकालिक धागे में अलग cpu संवेदनशील कार्यों को करने के लिए निम्नलिखित की तरह कुछ करने के लिए धागा सुरक्षित होना चाहिए:

from threading import Thread 

def send_async_email(msg): 
    mail.send(msg) 

def send_email(subject, sender, recipients, text_body, html_body): 
    msg = Message(subject, sender = sender, recipients = recipients) 
    msg.body = text_body 
    msg.html = html_body 
    thr = Thread(target = send_async_email, args = [msg]) 
    thr.start() 

आप कुछ और अधिक जटिल, तो शायद कुप्पी के अजवाइन या Multiprocessing "पूल के साथ पुस्तकालय की जरूरत है "आपके लिए उपयोगी हो सकता है।

मैं भूगर्भ से बहुत परिचित नहीं हूं हालांकि मैं कल्पना नहीं कर सकता कि आपको और जटिलता की आवश्यकता हो सकती है या क्यों।

मेरा मतलब है कि यदि आप एक प्रमुख विश्व वेबसाइट की दक्षता के लिए प्रयास कर रहे हैं, तो मैं अपने CPU गहन काम करने के लिए इमारत C++ अनुप्रयोग की सलाह देते हैं, और फिर उस प्रक्रिया को चलाने के कुप्पी के अजवाइन या पूल का उपयोग करेंगे। (यह यूट्यूब करता है जब सी ++ & पायथन)

+0

यूट्यूब कैसे करता है (ब्लॉगपोस्ट या कुछ) के लिए कोई स्रोत? – nikitautiu

+0

मैं अजवाइन का उपयोग कर समाप्त हुआ, लेकिन जैसा कि मैंने कहा, परिणामस्वरूप प्रतीक्षा करना वेबसर्वर को अवरुद्ध कर देता है। समाधान डब्लूएसजीआई ऐप को गीवेन्ट वर्कर के साथ या तो गीवेंट या गनिकॉर्न सर्वर के साथ सर्वर करना था। एसिंक परिणाम के लिए मैं बस 'तैयार() 'का चुनाव करता हूं और यदि पूरा नहीं होता है तो मैं एक कैननिकल' gevent.sleep()' के साथ उपज करता हूं। – nikitautiu

+0

मुझे डर है कि मेरे पास कोई लिंक नहीं है, लेकिन Google ब्लॉग इसकी तलाश करने के लिए एक जगह हो सकता है। – Dexter

1

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

+0

यह एक वैध समाधान है, और कुछ अन्य मैं सोच सकता हूं। मुद्दा यह है कि, मैं सोच रहा था कि भूगर्भ को फ्लास्क में कैसे एकीकृत किया जाए, और जो लोग भूगर्भ का उपयोग परिस्थितियों के साथ करते हैं, जहां यह एक समकालिक कार्य "हरा" बनाने के लिए असंभव है। – nikitautiu

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