2013-06-12 3 views
7

मैं विभिन्न अंतराल पर नौकरियों को निष्पादित करने के लिए एक पाइथन लिपि में time.sleep(n) का उपयोग करने के विचार से टकरा रहा हूं। स्यूडोकोड इस तरह दिखेगा:पायथन - time.sleep है (एन) cpu गहन?

total_jobs = [...] 

next_jobs_to_run = next_closest(total_jobs) 
min_time_to_wait = closestTime(nextJobsToRun) 

wait until min_time_to_wait 
run them all 
get next jobs 

संक्षेप में, कार्यक्रम तब तक सो जाता है जब तक कि अगले नौकरी की आवश्यकता नहीं होती है। यह नौकरी चलाता है, अपना अगला काम चलाने के लिए पाता है, और जब तक उसे अगली नौकरी चलाने की आवश्यकता नहीं होती है (अनंत तक जारी रहती है)। मैं इसे लिनक्स मशीन पर चलाने की योजना बना रहा हूं - एक क्रॉन नौकरी का उपयोग करना एक संभावना है। किसी के पास भी राय है?

+1

शीर्षक और प्रश्न असंबंधित हैं? – Serdalis

+0

@ सेरडलिस: वे एक ही प्रश्न नहीं हैं, लेकिन वे निश्चित रूप से संबंधित हैं। यदि 'नींद' व्यस्त-प्रतीक्षा करता है, तो वह उस व्यक्ति के सवाल को सुलझता है जिसका उपयोग करने के लिए ("नींद नहीं" के पक्ष में); यदि ऐसा नहीं होता है, तो यह सवाल खुलता है। (बेशक, जैसा कि यह निकलता है, यह नहीं करता है।) – abarnert

उत्तर

21

नहीं, यह सीपीयू गहन नहीं है।

The documentation का कहना है:

सेकंड की दी गई संख्या के लिए निष्पादन को निलंबित करें।

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

विशेष रूप से, जब से तुम linux के बारे में पूछा, और शायद CPython:

linux पर, और अधिकांश अन्य POSIX प्लेटफार्मों, यह आम तौर पर select का प्रयोग करेंगे। the 3.3 source देखें।

man page यह स्पष्ट करता है कि select सिग्नल, टाइमआउट या तैयार आई/ओ तक निलंबित करता है (और इस मामले में, कोई एफडीएस नहीं है, इसलिए बाद वाला असंभव है)।

आप पूर्ण विवरण के लिए कर्नेल स्रोत पढ़ सकते हैं, लेकिन मूल रूप से, जब तक कि कोई अप्रत्याशित सिग्नल न हो, तो आपको select की शुरुआत में संभवतः कताई की एक छोटी राशि को छोड़कर, बिल्कुल निर्धारित नहीं किया जाएगा (जैसा कि उन मामलों के लिए अनुकूलन जहां select लगभग तुरंत लौट सकते हैं)।


अपने सारांश के बीच में, से सवाल परिवर्तन करने के लिए "sleep CPU- सघन है" "मैं sleep, या एक क्रॉन जॉब इस्तेमाल करना चाहिए?"

किसी भी तरह से, आप प्रतीक्षा करते समय किसी भी CPU को जला नहीं रहे हैं। कुछ पेशेवर और विपक्ष हैं, लेकिन उनमें से अधिकांश तुच्छ हैं। से (मोटे तौर पर, और व्यक्तिपरक) सबसे कम से कम, एक क्रॉन नौकरी:

  • कॉन्फ़िगरेशन-इत्यादि की अनुमति देता है, शेड्यूल को बदलकर-स्रोत कोड संपादित किए बिना।
  • को कार्य करने के लिए कॉन्फ़िगरेशन की आवश्यकता है।
  • का अर्थ है कम कोड-अर्थात् कम बग, और भविष्य के पाठकों को समझने के लिए कम।
  • सिस्टम शटडाउन में जारी रहेगा।
  • फिर भी आग लग जाएगा भले ही आपकी स्क्रिप्ट अपवाद या सिग्नल से निकलती हो।
  • या तो 0, 1 या एन बार आग लग सकता है यदि इसकी निर्धारित अंतराल एन गुना (यह निर्दिष्ट नहीं है, और विभिन्न क्रॉन कार्यान्वयन अलग-अलग चीजें करते हैं) की गारंटी देता है।
  • में हैंडलिंग का एक बेहतर मौका है सिस्टम घड़ी में परिवर्तन।
  • प्रक्रिया लॉन्च, दुभाषिया स्टार्टअप इत्यादि के लिए प्रत्येक बार आग लगने के लिए भुगतान करना पड़ता है।
  • पृष्ठ तालिका और प्रक्रिया तालिका स्थान को बर्बाद नहीं करता है, क्योंकि कोई प्रक्रिया चल रही नहीं है और कोई मेमोरी मैप नहीं है।
3

नहीं, यह प्रोसेसर गहन नहीं है। यह प्रोसेसर निष्क्रिय करने देता है।

the documentation के अनुसार, यह निष्पादन को निलंबित करता है, इसका मतलब है कि यह प्रोसेसर गहन नहीं है। एक busy wait प्रोसेसर गहन होगा।

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