每n秒运行特定代码

是否有一种方法,例如,每n秒打印Hello World! ? 例如,程序将遍历我所拥有的任何代码,然后一旦经过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
535865 次浏览
def update():
import time
while True:
print 'Hello World!'
time.sleep(5)

它会作为函数运行。while True:使它永远运行。如果需要,你可以把它从函数中提出来。

你可以启动一个单独的线程,它的唯一职责是数5秒,更新文件,重复。您不希望这个单独的线程干扰主线程。

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

我对这个主题的拙见,是Alex Martelli的答案的概括,使用start()和stop()控件:

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,它将在下次运行后生效。对于argskwargs甚至function也是一样!
为自己省下一次精神分裂发作,使用高级Python调度器: http://pythonhosted.org/APScheduler < / p >

代码非常简单:

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()

下面是一个不是每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的当前实现

下面是一个与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()