定时任务调度总结1)

一、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.Timer
A 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)




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值