पायथन प्रोग्राम को हमेशा के लिए कैसे चलाएं?


87

मुझे अपने लायन प्रोग्राम को अनंत लूप में हमेशा के लिए चलाने की जरूरत है।

वर्तमान में मैं इसे इस तरह चला रहा हूं -

#!/usr/bin/python

import time

# some python code that I want 
# to keep on running


# Is this the right way to run the python program forever?
# And do I even need this time.sleep call?
while True:
    time.sleep(5)

क्या इसे करने का कोई बेहतर तरीका है? या मुझे time.sleepकॉल की भी आवश्यकता है ? कोई विचार?


यह करने का सही तरीका होगा। आपको इसकी आवश्यकता नहीं है time.sleep(5), जब तक आपके पास while True:लाइन के नीचे कुछ कोड इंडेंट है (यह सिर्फ passएक न्यूनतम पर हो सकता है )
पवित्र मैकेरल

1
ब्रेक की स्थिति को जोड़ने के लिए अच्छा है - "शटडाउन हुक", यदि आप प्रक्रिया को मारने के बजाय बाहर निकलना चाहते हैं।
user3020494

7
लेकिन अगर आप सोते नहीं हैं, या ऐसा कुछ करते हैं जो किसी बाहरी घटना के लिए सोता है (जैसे किसी सॉकेट पर कनेक्शन या डेटा सुनने के लिए) तो आपका प्रोग्राम 100% CPU, उर्फ व्यस्तता का उपयोग करेगा । यह विनम्र नहीं है :)
qris

पायथन 3.5 एसिंको का उपयोग कर सकता है और घटनाओं के लिए कार्यों को बाँध सकता है। GUI के साथ कार्यक्रम ui- घटना पाश (उदाहरण के लिए gtk.main ())
eri

यह इस प्रश्न के डुप्लिकेट की तरह लगता है: stackoverflow.com/questions/3226628/non-blocking-wait-in-python
dllahr

जवाबों:


104

हां, आप एक while True:लूप का उपयोग कर सकते हैं जो कि पायथन कोड को लगातार चलाने के लिए कभी नहीं टूटता है।

हालाँकि, आपको उस कोड को डालना होगा जिसे आप लूप के अंदर लगातार चलाना चाहते हैं :

#!/usr/bin/python

while True:
    # some python code that I want 
    # to keep on running

साथ ही, किसी स्क्रिप्ट के संचालन को कुछ समय के time.sleepलिए स्थगित करने के लिए उपयोग किया जाता है । इसलिए, जब से आप चाहते हैं कि आप लगातार चलाएं, मैं यह नहीं देखता कि आप इसका उपयोग क्यों करेंगे।



2
मई time.sleepउदाहरण 1ms के लिए इंतजार कर के बजाय उसकी अधिकतम गति से चल रहा द्वारा प्रदर्शन में सुधार?
538ROMEO 10

36

इसके बारे में क्या खयाल है?

import signal
signal.pause()

यह आपके प्रोग्राम को तब तक सोने देगा, जब तक कि यह किसी अन्य प्रक्रिया (या स्वयं, किसी अन्य थ्रेड में) से संकेत प्राप्त न कर ले, इससे यह पता चलता है कि यह कुछ करने का समय है।


2
सिग्नल थ्रेड बंद हो जाएगा। शीर्षक हमेशा के लिए चलने वाला है। जैसे सिस्टम सर्विस या डेमॉन।
14

1
क्या यह केवल मुख्य धागे को रोक सकता है, जिससे अन्य धागा अनिश्चित काल तक चल सकता है?
डेविड वी।

@ डेविड हाँ, यह केवल मुख्य धागे को रोकता है। मैंने सिर्फ पुष्टि करने के लिए परीक्षण किया।
शमूएल

9

नींद सीपीयू पर अधिभार से बचने का एक अच्छा तरीका है

यकीन नहीं अगर यह वास्तव में चालाक है, लेकिन मैं आमतौर पर उपयोग करता हूं

while(not sleep(5)):
    #code to execute

नींद की विधि हमेशा कोई भी नहीं लौटाता है।


कोई टिप्पणी नहीं के साथ उतरे? मुझे यह समाधान पसंद आया जब मैंने इसे पढ़ा, क्योंकि इसमें अच्छी पठनीयता / स्थिरता है। इस कोड के एक इच्छुक पाठक को लूप अंतराल को खोजने के लिए स्क्रॉल पर जाने की आवश्यकता नहीं है।
मैट

1
@ मुस्तफा कौन सा? अपने आप को समझाएं, यह पूरी तरह से ठीक काम करता है।
पोरुंगा

1
यह पहले निष्पादन से पहले सो नहीं करता है? मुझे नहीं लगता कि यह सामान्य व्यवहार है
noonex

7

मुझे पता है कि यह बहुत पुराना धागा है लेकिन किसी ने इसका उल्लेख क्यों नहीं किया

#!/usr/bin/python3
import asyncio 

loop = asyncio.get_event_loop()
try:
    loop.run_forever()
finally:
    loop.close()

1
मैं हमेशा इसका उपयोग करता हूं जब मेरे कार्यक्रम को हमेशा के लिए चलाने की कोशिश की जाती है। मुझे नहीं पता कि किसी ने भी इसका उल्लेख क्यों नहीं किया
मैडलडेन

5

OS के समर्थन के लिए select:

import select

# your code

select.select([], [], [])

5

यहाँ पूरा वाक्यविन्यास है,

#!/usr/bin/python3

import time 

def your_function():
    print("Hello, World")

while True:
    your_function()
    time.sleep(10) #make function to sleep for 10 seconds

1

मेरे पास एक छोटी सी स्क्रिप्ट है इंटरप्टेब्लोपोफ़ॉर्म जो एक अंतराल पर कोड चलाता है (डिफ़ॉल्ट 1sec), यह स्क्रीन पर एक संदेश को चलाता है जबकि यह चल रहा है, और एक बाधा सिग्नल को फंसाता है जिसे आप CTL-C के साथ भेज सकते हैं:

#!/usr/bin/python3
from interruptableLoop import InterruptableLoop

loop=InterruptableLoop(intervalSecs=1) # redundant argument
while loop.ShouldContinue():
   # some python code that I want 
   # to keep on running
   pass

जब आप स्क्रिप्ट चलाते हैं और फिर उसे बाधित करते हैं तो आप यह आउटपुट देखते हैं, (पीरियड्स लूप के हर पास पर पंप करते हैं):

[py36]$ ./interruptexample.py
CTL-C to stop   (or $kill -s SIGINT pid)
......^C
Exiting at  2018-07-28 14:58:40.359331

interruptableLoop.py :

"""
    Use to create a permanent loop that can be stopped ...

    ... from same terminal where process was started and is running in foreground: 
        CTL-C

    ... from same user account but through a different terminal 
        $ kill -2 <pid> 
        or $ kill -s SIGINT <pid>

"""
import signal
import time
from datetime import datetime as dtt
__all__=["InterruptableLoop",]
class InterruptableLoop:
    def __init__(self,intervalSecs=1,printStatus=True):
        self.intervalSecs=intervalSecs
        self.shouldContinue=True
        self.printStatus=printStatus
        self.interrupted=False
        if self.printStatus:
            print ("CTL-C to stop\t(or $kill -s SIGINT pid)")
        signal.signal(signal.SIGINT, self._StopRunning)
        signal.signal(signal.SIGQUIT, self._Abort)
        signal.signal(signal.SIGTERM, self._Abort)

    def _StopRunning(self, signal, frame):
        self.shouldContinue = False

    def _Abort(self, signal, frame):
        raise 

    def ShouldContinue(self):
        time.sleep(self.intervalSecs)
        if self.shouldContinue and self.printStatus: 
            print( ".",end="",flush=True)
        elif not self.shouldContinue and self.printStatus:
            print ("Exiting at ",dtt.now())
        return self.shouldContinue

क्या ग्राहक कोड में केवल KeyboardInterruptऔर उसके SystemExitअपवादों को पकड़ना बहुत आसान (और अधिक पायथोनिक) नहीं होगा , बल्कि इसके लिए एक समर्पित वर्ग होना चाहिए?
मैथ्यू कोल

मैं इसे एनकैप्सुलेशन के लिए उपयोग करता हूं, और मुझे इसका तरीका पसंद है। जाहिर है के कार्यान्वयन interruptableloop जब मैं यह उपयोग कर रहा हूँ मेरे मन के माध्यम से नहीं चलता है।
रियाज रिजवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.