मैं इस पायथन प्रोग्राम के लिए सीपीयू का उपयोग कैसे कम कर सकता हूं?


15

मैं एक लूप में 24/7 एक पायथन चला रहा हूं, यहां कार्यक्रम के प्रकार का एक उदाहरण है:

while True:

    print ("me again...")

लेकिन जब मैं इसे चलाता हूं, तो मेरा सीपीयू 100% हो जाता है! लेकिन मैं नहीं चाहता कि चूंकि मेरा कार्यक्रम लंबे समय तक चलेगा, आदि और मैं नहीं चाहता कि मेरा सीपीयू बहुत गर्म हो, वैसे भी क्या मैं इसे रोक सकता हूं?


3
प्रतीक्षा के बिना सीपीयू 100% हो जाता है, क्योंकि आपने इसे बताया है :) जितना संभव हो उतना तेज़ी से प्रिंट करें। तो इंतजार उस बोझ को उतारने में मदद करेगा। प्रिंट, आम तौर पर एक बहुत महंगा ऑपरेशन है। किसी फ़ाइल पर लिखना बहुत सस्ता है।
पिओटर कुला

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

जवाबों:


16

अपने पाश के अंत में एक है

time.sleep(xx)सेकंड के लिए, या time.sleep(x.x)आंशिक सेकंड का प्रतिनिधित्व करने के लिए

(कृपया पुस्तकालय समय आयात करने के लिए है, इसलिए की तरह याद है: import time)

अपने कार्यक्रम को प्रतिकूल रूप से प्रभावित किए बिना xx जितना संभव हो सके। अभी आपका प्रोग्राम हमेशा सब कुछ उतना ही तेजी से कर रहा है, जितना कि पीआई को आराम करने या कुछ और करने के लिए कुछ समय देने के बजाय।


हम्म्म्म ... बहुत दिलचस्प ... मैं इसे आज़माऊँगा। धन्यवाद! विश्वास नहीं कर सकता मैं ऐसा नहीं सोचा था!
user151324

वहाँ एक पुस्तकालय मैं आयात करना चाहिए, आदि? मुझे यह कहते हुए एक त्रुटि हो रही है कि समय परिभाषित नहीं है
user151324

@ coding_corgi हाँ, आपको समय की लाइब्रेरी की आवश्यकता है।
बट्स

2
तो import time?
user151324

@coding_corgi। हां यह सही है।
बटर

14

प्रस्तावना

सुनिश्चित करें कि आपको वास्तव में अपने कार्य को बार-बार चलाने की आवश्यकता है। इसे व्यस्त प्रतीक्षा कहा जाता है और लगभग हमेशा उप-मध्य में रखा जाता है। यदि आपका कार्य किसी उपप्रकार के उत्पादन के लिए जाँच कर रहा है, तो आप subprocess.wait()इसे समाप्त करने के लिए कर सकते हैं , उदाहरण के लिए। यदि आपका कार्य फाइलसिस्टम में किसी फ़ाइल या निर्देशिका के स्पर्श का इंतजार करना है, तो आप कर्नेल द्वारा संभाले गए फाइलसिस्टम इवेंट से अपने कोड को ट्रिगर करने के लिए pyinotify का उपयोग कर सकते हैं ।

उत्तर

यह है कि आप बहुत अधिक सीपीयू का उपभोग किए बिना व्यस्त प्रतीक्षा के लिए अनंत लूप लिखते हैं।

अजगर 2:

from __future__ import print_function
from __future__ import division

import time

while True:
    range(10000)       # some payload code
    print("Me again")  # some console logging
    time.sleep(0.2)    # sane sleep time of 0.1 seconds

अजगर 3:

import time

while True:
    range(10000)       # some payload code
    print("Me again")  # some console logging
    time.sleep(0.2)    # sane sleep time of 0.1 seconds

मूल्यांकन

जैसा कि @gnibbler ने एक अन्य उत्तर में परीक्षण किया है , प्रस्तुत कोड को हाल की मशीनों पर 1% से अधिक सीपीयू का उपभोग नहीं करना चाहिए। यदि यह अभी भी आपके पेलोड कोड के साथ बहुत अधिक सीपीयू का उपभोग करता है, तो आगे भी सोने के लिए समय बढ़ाने पर विचार करें। दूसरी ओर, बार-बार निष्पादन के लिए पेलोड कोड को अनुकूलित करने की आवश्यकता हो सकती है। उदाहरण के लिए, कैशिंग अपरिवर्तित डेटा पर चलने में तेजी ला सकता है।

क्रेडिट

यह उत्तर @ user2301728 के उत्तर को बनाने की कोशिश करता है ।


3

मेरे पास एक ही मुद्दा था, स्टैक एक्सचेंज पर मेरा प्रश्न देखें । समाधान का एक संयोजन था time.sleep(0.01)और niceniceएक आवेदन के लिए उपलब्ध सीपीयू को कम करती है। यह है कि मैं ऐप कैसे शुरू करता हूं nice -n 19:।


1

आप भी आजमा सकते हैं nice -n 19 python myscript.py

अच्छा एक कार्य की CPU प्राथमिकता निर्धारित करने के लिए एक * निक्स उपयोगिता है। 19 सबसे बड़ा वजन है और परिणामस्वरूप सबसे धीमी सेटिंग है।


2
नहीं। एक प्रक्रिया की अच्छाई को बढ़ाने से सीपीयू को अधिक बार प्राप्त करने के लिए अन्य प्रक्रियाओं को सक्षम करने में मदद मिलती है। किसी भी समय कोई अन्य प्रक्रिया नहीं है, ओपी के कोड अभी भी 100% सीपीयू का उपयोग करेंगे और यदि हैं, तो वे सीपीयू का उपयोग करेंगे, कुल मिलाकर 100%।
बेंगट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.