たとえば、Hello World!
をn秒ごとに印刷する方法はありますか?たとえば、プログラムは私が持っていたコードをすべて処理し、5秒が経過すると(time.sleep()
を使用)、そのコードを実行します。 Hello Worldを印刷するのではなく、これを使用してファイルを更新します。
例えば:
startrepeat("print('Hello World')", .01) # Repeats print('Hello World') ever .01 seconds
for i in range(5):
print(i)
>> Hello World!
>> 0
>> 1
>> 2
>> Hello World!
>> 3
>> Hello World!
>> 4
import threading
def printit():
threading.Timer(5.0, printit).start()
print "Hello, World!"
printit()
# continue with the rest of your code
https://docs.python.org/3/library/threading.html#timer-objects
Start()およびstop()コントロールを使用した、Alex Martelliの答えの一般化である、このテーマに関する謙虚な見解:
from threading import Timer
class RepeatedTimer(object):
def __init__(self, interval, function, *args, **kwargs):
self._timer = None
self.interval = interval
self.function = function
self.args = args
self.kwargs = kwargs
self.is_running = False
self.start()
def _run(self):
self.is_running = False
self.start()
self.function(*self.args, **self.kwargs)
def start(self):
if not self.is_running:
self._timer = Timer(self.interval, self._run)
self._timer.start()
self.is_running = True
def stop(self):
self._timer.cancel()
self.is_running = False
使用法:
from time import sleep
def hello(name):
print "Hello %s!" % name
print "starting..."
rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
try:
sleep(5) # your long-running job goes here...
finally:
rt.stop() # better in a try/finally block to make sure the program ends!
特徴:
start()
およびstop()
は、タイマーが既に開始/停止している場合でも複数回呼び出すのが安全ですinterval
はいつでも変更でき、次回の実行後に有効になります。 args
、kwargs
、さらにはfunction
についても同じです!統合失調症のエピソードを保存し、高度なPythonスケジューラーを使用します。 http://pythonhosted.org/APScheduler
コードはとてもシンプルです:
from apscheduler.scheduler import Scheduler
sched = Scheduler()
sched.start()
def some_job():
print "Every 10 seconds"
sched.add_interval_job(some_job, seconds = 10)
....
sched.shutdown()
def update():
import time
while True:
print 'Hello World!'
time.sleep(5)
それは関数として実行されます。 while True:
は、永久に実行します。必要に応じて、いつでも関数から取り出すことができます。
APScheduler 3.00 + と互換性のある簡単な例を次に示します。
# note that there are many other schedulers available
from apscheduler.schedulers.background import BackgroundScheduler
sched = BackgroundScheduler()
def some_job():
print('Every 10 seconds')
# seconds can be replaced with minutes, hours, or days
sched.add_job(some_job, 'interval', seconds=10)
sched.start()
...
sched.shutdown()
または、次を使用できます。他の多くの選択肢とは異なり、このタイマーはn秒ごとに目的のコードを実行します(コードの実行にかかる時間に関係なく)。したがって、ドリフトを許すことができない場合、これは素晴らしいオプションです。
import time
from threading import Event, Thread
class RepeatedTimer:
"""Repeat `function` every `interval` seconds."""
def __init__(self, interval, function, *args, **kwargs):
self.interval = interval
self.function = function
self.args = args
self.kwargs = kwargs
self.start = time.time()
self.event = Event()
self.thread = Thread(target=self._target)
self.thread.start()
def _target(self):
while not self.event.wait(self._time):
self.function(*self.args, **self.kwargs)
@property
def _time(self):
return self.interval - ((time.time() - self.start) % self.interval)
def stop(self):
self.event.set()
self.thread.join()
# start timer
timer = RepeatedTimer(10, print, 'Hello world')
# stop timer
timer.stop()
n
秒ごとに新しいスレッドを作成しないバージョンを次に示します。
from threading import Event, Thread
def call_repeatedly(interval, func, *args):
stopped = Event()
def loop():
while not stopped.wait(interval): # the first call is in `interval` secs
func(*args)
Thread(target=loop).start()
return stopped.set
イベントは、繰り返しを停止するために使用されます。
cancel_future_calls = call_repeatedly(5, print, "Hello, World")
# do something else here...
cancel_future_calls() # stop future calls
setInterval pythonの現在の実装を改善する を参照してください
5秒のカウント、ファイルの更新、繰り返しを行うことが唯一の義務である別のスレッドを開始できます。この別個のスレッドがメインスレッドに干渉することは望ましくありません。