2012-10-22 6 views
5

में धागे बनाम प्रक्रियाएं मैं पाइथन का उपयोग करके एक प्रोग्राम शुरू करने जा रहा हूं जो ज्यादातर मतदान कर रहा है, यह लगातार सीरियल पोर्ट (PySerial के माध्यम से) से पढ़ा जाएगा और फ़ाइल डिस्क्रिप्टर से पढ़ा जाएगा जो समय से बदल जाएगा पहर। मैंने threading मॉड्यूल को देखना शुरू कर दिया लेकिन फिर मैंने more और more को multiprocessing मॉड्यूल का उपयोग करने के सुझावों को ढूंढना जारी रखा।पाइथन

मुझे पाइथन में अच्छी तरह से पता नहीं है, ज्यादातर सी पृष्ठभूमि से आ रहा है। पायथन में थ्रेडेड दृष्टिकोण के तकनीकी फायदे क्या हैं?

सी में, धागे डेटा बनाम साझा करते हैं, कुछ आईपीसी को संवाद करने के लिए सेट करते हैं, जो कि पाइथन के लिए समान लगता है?

मेरे USECASE:

Main process (or thread?) - 
    start & initialize 
     | 
     V 
    spaw child----------------------> start & initialize 
     |         | 
     V         V 
     while (1) <------------+   wait for data<------+ 
     |      |    |    | 
     V      |    V    | 
    read file descriptors  |   read from   | 
     |      |   serial port<-----+ | 
     V      |    |   | | 
    value changed? ------No--+    V   | | 
     |     ^  message done?--No-+ | 
     V      |    |    | 
    Report change------------+    V    | 
    over serial      alert parent---------+ 

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

+1

मल्टीप्रोसेसिंग जीआईएल को हटाने के लिए एक (कुछ हद तक छद्म आईएमएचओ) तरीका है। इस मामले में, मुझे लगता है कि 'थ्रेडिंग' जाने का रास्ता है। – mgilson

+0

@ डाउनवॉटर - क्या मुझे एक कारण हो सकता है कि आप यह प्रश्न क्यों महसूस करते हैं: "अनुसंधान प्रयास नहीं दिखाता है, यह अस्पष्ट है या उपयोगी नहीं है"? – Mike

उत्तर

11

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

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

+0

बहुत बढ़िया उत्तर धन्यवाद। मुझे लगता है कि मुझे जीआईएल में थोड़ा और देखने की ज़रूरत है। यह मेरे लिए एक नई अवधारणा है। – Mike

+2

यह सीपीथॉन का कार्यान्वयन विवरण है कि 99% मामलों में लोग वास्तव में भी लटकाते हैं, इससे कोई फर्क नहीं पड़ता। –