一、linux自带服务或shell 命令
1. 大名鼎鼎的crontab
crontab 作为linux自带的定时服务,能指定周期性的执行某些任务,或者在某天或者某周的特定时间执行某些任务,但是执行的精度是分钟
2. watch 命令
watch命令可以周期性的执行某个命令,并将结果显示在标准输出上
一个常见的例子可以是
1) 每隔3秒往/tmp/aa中写入一个字符串 abc
watch -n 3 'echo "abc" >> /tmp/aa'
2) 每隔3秒查看一下/proc/net/sockstat 的内容
watch -n 3 cat /proc/net/sockstat
此命令的执行精度是秒级
二、python 语言中的某些定时器
最常见的有两个
1.
class threading.TimerA thread that executes a function after a specified interval has passed.
使用代码举例如下
import time
from threading import Timer
def print_time():
print "From print_time", time.time()
def print_some_times():
print time.time()
Timer(5, print_time, ()).start()
Timer(10, print_time, ()).start()
time.sleep(11) # sleep while time-delay events execute
print time.time()
print_some_times()
Timer类的源代码如下:
# The timer class was contributed by Itamar Shtull-Trauring
def Timer(*args, **kwargs):
return _Timer(*args, **kwargs)
class _Timer(Thread):
"""Call a function after a specified number of seconds:
t = Timer(30.0, f, args=[], kwargs={})
t.start()
t.cancel() # stop the timer's action if it's still waiting
"""
def __init__(self, interval, function, args=[], kwargs={}):
Thread.__init__(self)
self.interval = interval
self.function = function
self.args = args
self.kwargs = kwargs
self.finished = Event()
def cancel(self):
"""Stop the timer if it hasn't finished yet"""
self.finished.set()
def run(self):
self.finished.wait(self.interval)
if not self.finished.is_set():
self.function(*self.args, **self.kwargs)
self.finished.set()
我们可以看出由于_Timer是继承了Thread类,因此每创建一个定时任务都会创建一个线程 当有大量要执行的定时任务,则线程数会过多,增加线程上下文切换的代价
2. sched模块
使用代码举例如下:
import sched
import time
s = sched.scheduler(time.time, time.sleep)
def print_time():
print "From print_time", time.time()
def print_some_times():
print time.time()
s.enter(5, 1, print_time, ())
s.enter(10, 1, print_time, ())
s.run()
print time.time()
print_some_times()
scheduler 类的实例会维护一个基于时间的优先级队列,任务按照时间排好序,然后按时间逐个执行这些任务 scheduler的实例是单线程的
python 中的定时任务都只能执行一次,无法进行周期性的执行,但是我们可以很简单的修改Timer类的源码定义我们自己的周期性执行的类
from threading import Thread, Event
class PeriodTimer(Thread):
def __init__(self, interval, function, args=[], kwargs={}):
Thread.__init__(self)
self.interval = interval
self.function = function
self.args = args
self.kwargs = kwargs
self.finished = Event()
def cancel(self):
"""Stop the timer if it hasn't finished yet"""
self.finished.set()
def run(self):
while not self.finished.is_set():
self.finished.wait(self.interval)
if not self.finished.is_set():
self.function(*self.args, **self.kwargs)