首页 > 其他 > 详细

定时任务调度总结1)

时间:2014-04-03 03:53:20      阅读:381      评论:0      收藏:0      [点我收藏+]

一、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)




















定时任务调度总结1),布布扣,bubuko.com

定时任务调度总结1)

原文:http://blog.csdn.net/woshiaotian/article/details/22824111

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!