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


83

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電話が必要ですか?何かご意見は?


それが正しい方法です。線のtime.sleep(5)下にインデントされたコードがある限り、は必要ありませんwhile True:pass最小でもかまいません)
Holy Mackerel

1
プロセスを強制終了するのではなく、終了する場合は、ブレーク条件(「シャットダウンフック」)を追加することをお勧めします。
user3020494 2013年

7
ただし、スリープしない場合、または外部イベント(ソケット上の接続やデータのリッスンなど)のためにスリープする何かを行う場合、プログラムは100%CPU、別名busywaitを使用します。これは礼儀正しくありません:)
qris 2015

Python 3.5は、非同期を使用して関数をイベントにバインドできます。GUIを備えたプログラムは、ui-eventループ(たとえば、gtk.main())を処理できます
eri

これはこの質問の複製のようです: stackoverflow.com/questions/3226628/non-blocking-wait-in-python
dllahr 2017年

回答:


99

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

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

#!/usr/bin/python

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

また、スクリプトの操作を一定期間中断するためにtime.sleep使用されます。それで、あなたはあなたが継続的に走りたいので、なぜあなたがそれを使うのか分かりません。


.batファイル経由でPythonのコードを起動するときTrueが動作するようには思えないながら
BarryMahnlyを

1
time.sleep例の1msのを待っている代わりに、その最高速度で実行することにより、パフォーマンスを向上させますか?
538ROMEO

34

これはどう?

import signal
signal.pause()

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


2
信号はスレッドを停止します。タイトルは永遠に走ることについてです。システムサービスやデーモンのように。
時間外2015

1
それはメインスレッドのみを停止し、他のスレッドが無期限に実行できるようにしますか?
David V.

@Davidはい、これはメインスレッドのみを停止します。確認のためにテストしました。
サミュエル

9

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

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

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

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


コメントなしで反対票を投じましたか?このソリューションは、読みやすさや保守性に優れているため、読んだときに気に入りました。このコードの興味のある読者は、ループ間隔を見つけるためにスクロールする必要はありません。
マット

1
@mustafaどれ?あなた自身を説明してください、それは完全にうまくいきます。
ポルンガ2018

1
最初の実行前にスリープしませんか?私はそれが一般的に望ましい動作ではないと思います
noonex

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

5

私はこれが古すぎるスレッドであることを知っていますが、なぜ誰もこれに言及しなかったのですか

#!/usr/bin/python3
import asyncio 

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

1
プログラムを永久に実行しようとするときは、常にこれを使用します。なぜ誰もこれについて言及しなかったのかわかりません
madladzen

1

コードを一定の間隔(デフォルトは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

それは非常に簡単(そして、よりPython的には)ちょうどキャッチすることではないかKeyboardInterruptSystemExitクライアントコードで例外をではなく、そのための専用のクラスがありますか?
マシューコール

私はこれをカプセル化に使用し、その読み方が気に入っています。明らかに、interruptableloopの実装は、私がそれを使用しているときは頭に浮かびません。
Riaz Rizvi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.