web-dev-qa-db-ja.com

Pythonプログラムを永久に実行する方法は?

Pythonプログラムを無限ループで永久に実行する必要があります。

現在、私はこのように実行しています-

#!/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呼び出しさえ必要ですか?何かご意見は?

57
user2467545

はい、Pythonコードを継続的に実行するために中断しないwhile True:ループを使用できます。

ただし、継続的に実行するコードをループ内に配置する必要があります。

#!/usr/bin/python

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

また、 time.sleep は、一定期間スクリプトの操作をsuspendするために使用されます。したがって、あなたはあなたのものを継続的に実行したいので、なぜそれを使用するのかわかりません。

75
iCodez

これはどう?

import signal
signal.pause()

これにより、プログラムは、他のプロセス(または別のスレッドのそれ自体)からシグナルを受信するまでスリープ状態になり、何かを行う時間であることを知らせます。

27
roarsneer

スリープはCPUの過負荷を避ける良い方法です

それが本当に賢いかどうかはわかりませんが、私は通常使用します

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

sleepメソッドは常にNoneを返します。

4
Porunga

selectをサポートするOSの場合:

import select

# your code

select.select([], [], [])
4
gnr

完全な構文は次のとおりです。

#!/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
3
Balaji.J.B

間隔(デフォルトは1秒)でコードを実行する小さなスクリプトinterruptableloop.pyがあり、実行中に画面にメッセージを送り出します。 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
1
Riaz Rizvi

上記のすべてのコードは、コードを無限に実行するのに役立ちますが、Nohupを使用してバックグラウンドでコードを実行する場合に役立ちます。

Nohup pythonScript.py
0
Robins.Deepak