2009-04-24 7 views
36

मुझे एक थ्रेड मिला है जो हार्डवेयर का एक टुकड़ा मतदान कर रहा है।एक थ्रेडिंग कैसे करता है। पाइथन में इसके बाकी क्वांटम पैदा करें?

while not hardware_is_ready(): 
    pass 
process_data_from_hardware() 

लेकिन अन्य धागे (और प्रक्रियाएं!) हैं जिनके पास चीजें हो सकती हैं। यदि ऐसा है, तो मैं हार्डवेयर को हर दूसरे निर्देश की जांच करने के लिए सीपीयू को जलाना नहीं चाहता हूं। यह थोड़ी देर के बाद से मैंने थ्रेडिंग के साथ निपटाया है, और जब मैंने इसे पायथन नहीं किया था, लेकिन मेरा मानना ​​है कि अधिकांश थ्रेडिंग लाइब्रेरीज़ में yield फ़ंक्शन या कुछ ऐसा होता है जो थ्रेड को शेड्यूलर को बताने की अनुमति देता है "अन्य धागे को मौका दें। "

while not hardware_is_ready(): 
    threading.yield()   # This function doesn't exist. 
process_data_from_hardware() 

लेकिन मुझे थ्रेडिंग दस्तावेज़ में इस तरह के किसी भी संदर्भ का कोई संदर्भ नहीं मिल रहा है। पायथन में yield कथन है, लेकिन मुझे पूरा यकीन है कि पूरी तरह से कुछ और है (जेनरेटर के साथ करने के लिए)।

यहां करने के लिए सही चीज़ क्या है?

उत्तर

55

time.sleep(0) नियंत्रण उत्पन्न करने के लिए पर्याप्त है - सकारात्मक ईपीएसलॉन का उपयोग करने की आवश्यकता नहीं है। दरअसल, time.sleep(0) मतलब "जो कुछ भी धागा तैयार हो सकता है"।

+4

क्या यह कहीं दस्तावेज है? मैंने सोचा कि यह सच हो सकता है - मैंने इसे अन्य भाषाओं में देखा है - लेकिन मुझे पाइथन दस्तावेज़ों में इसका उल्लेख नहीं मिला। उदाहरण के लिए –

+3

, http://docs.python.org/library/sched.html "अन्य घटनाओं को बहु-थ्रेडेड अनुप्रयोगों में चलाने का मौका देने के लिए प्रत्येक ईवेंट चलाने के बाद देरीफनक को तर्क 0 के साथ भी बुलाया जाएगा।" (delayfunc आमतौर पर समय है। यहाँ सो जाओ)। मैं मानता हूं कि यह अच्छा होगा अगर इसे मॉड्यूल समय में अधिक प्रत्यक्ष रूप से दस्तावेज किया गया था ;-) –

+1

अच्छी तरह छिपा हुआ! धन्यवाद! –

11

ग्लोबल इंटरप्रेटर लॉक (जीआईएल) पर पढ़ें।

उदाहरण के लिए: http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/

इसके अलावा

: http://www.pyzine.com/Issue001/Section_Articles/article_ThreadingGlobalInterpreter.html

अपने कोड में ऐसा करते हैं तो आप व्यस्त प्रतीक्षा की जा रही (जैसे मतदान एक उपकरण) करना चाहिए।

time.sleep(0.0001) 

यह थ्रेड शेड्यूलर को मिलेगा।

इसके अलावा, मैं http://homepage.mac.com/s_lott/iblog/architecture/C551260341/E20081031204203/index.html

+2

मैं कोई विशेषज्ञ नहीं हूं, लेकिन मैंने जीआईएल पर थोड़ा सा पढ़ा है। क्या आप मुझे एक संकेत दे सकते हैं जो विशेष रूप से इस प्रश्न से संबंधित है? मैं अब के लिए 'time.sleep (epsilon) 'के साथ जाऊंगा, लेकिन यह असंतुष्ट है, है ना? कोई विशेष अंतराल नहीं है जिसके लिए मैं सोना चाहता हूं। –

+0

यदि आपका हार्डवेयर इंटरप्ट नहीं भेज सकता है तो यह एकमात्र समाधान है। – Unknown

+0

'time.sleep() 'का उपयोग किए बिना पाइथन पूर्व-खाली उपज कैसे करता है? उपज क्या होती है? – CMCDragonkai

3

में कुछ नोट और संदर्भ एकत्र आप * nix पर इस कर रहे हैं, तो आप select पुस्तकालय उपयोगी लग सकते। Kamaela में कुछ ऐसे घटक भी हैं जो आपको उपयोगी लग सकते हैं, लेकिन इसके लिए एक प्रतिमान परिवर्तन की आवश्यकता हो सकती है।

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