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
呼び出しさえ必要ですか?何かご意見は?
はい、Pythonコードを継続的に実行するために中断しないwhile True:
ループを使用できます。
ただし、継続的に実行するコードをループ内に配置する必要があります。
#!/usr/bin/python
while True:
# some python code that I want
# to keep on running
また、 time.sleep
は、一定期間スクリプトの操作をsuspendするために使用されます。したがって、あなたはあなたのものを継続的に実行したいので、なぜそれを使用するのかわかりません。
これはどう?
import signal
signal.pause()
これにより、プログラムは、他のプロセス(または別のスレッドのそれ自体)からシグナルを受信するまでスリープ状態になり、何かを行う時間であることを知らせます。
スリープはCPUの過負荷を避ける良い方法です
それが本当に賢いかどうかはわかりませんが、私は通常使用します
while(not sleep(5)):
#code to execute
sleepメソッドは常にNoneを返します。
select
をサポートするOSの場合:
import select
# your code
select.select([], [], [])
完全な構文は次のとおりです。
#!/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秒)でコードを実行する小さなスクリプト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
上記のすべてのコードは、コードを無限に実行するのに役立ちますが、Nohupを使用してバックグラウンドでコードを実行する場合に役立ちます。
Nohup pythonScript.py