有阻塞任务sched,从run开始后阻塞,此时会判断delay时间时候到达或者超过了就当即执行,若是到了就执行若是没到就等待知道执行,若是python
#!usr/bin/env python # -*- coding: utf-8 -*- import time import sched # 第一个工做函数 # 第二个参数 @starttime 表示任务开始的时间 # 很明显参数在创建这个任务的时候就已经传递过去了,至于任务什么时候开始执行就由调度器决定了 def worker(msg, starttime): print u"任务执行的时刻", time.time(), "传达的消息是", msg, '任务创建时刻', starttime # 建立一个调度器示例 # 第一参数是获取时间的函数,第二个参数是延时函数 # print u'---------- 两个简单的例子 -------------' # print u'程序启动时刻:', time.time() s = sched.scheduler(time.time, time.sleep) # s.enter(1, 1, worker, ('hello', time.time())) # s.enter(3, 1, worker, ('world', time.time())) # s.run() # 这一个 s.run() 启动上面的两个任务 # print u'睡眠2秒前时刻:', time.time() # time.sleep(2) # print u'睡眠2秒结束时刻:', time.time() # # 重点关注下面2个任务,创建时间,启动时间 # 2个任务的创建时间都很好计算,但有没有发现 "hello world [3]" 的启动时间比创建时间晚 13 秒, # 这不就是2个 sleep 的总延时吗?因此说启动时间并不必定就是 delay 能指定的,还须要看具体的程序环境, # 若是程序堵塞的很厉害,已经浪费了一大段的时间尚未到 scheduler 能调度这个任务,当 scheduler 能调度这个 # 任务的时候,发现 delay 已通过去了, scheduler 为了弥补“罪过”,会立刻启动这个任务。 # 任务 "hello world [15]" 就是一个很好的例子,正常状况下,程序没有阻塞的那么厉害,在scheduler 能调度这个任务的时候 # 发现 delay 还没到就等待,若是 delay 时间到了就能够在刚好指定的延时调用这个任务。 print u'\n\n---------- 两个复杂的例子 -------------' s.enter(3, 1, worker, ('hello world [3]', time.time())) print u'睡眠7秒前时刻:', time.time() time.sleep(7) print u'睡眠7秒结束时刻:', time.time() s.enter(15, 1, worker, ('hello world [15]', time.time())) print u'睡眠6秒前时刻:', time.time() time.sleep(6) print u'睡眠6秒结束时刻:', time.time() s.run() # 过了2秒以后,启动另一个任务 # # # print u'程序结束时刻', time.time()
无阻塞的timmer()异步
#!usr/bin/env python # -*- coding: utf-8 -*- # 异步执行任务 import sched from threading import Timer import time def func(msg, starttime): print u'程序启动时刻:', starttime, '当前时刻:', time.time(), '消息内容 --> %s' % (msg) s = sched.scheduler(time.time, time.sleep) # 下面的两个语句和上面的 scheduler 效果同样的 Timer(5, func, ('hello', time.time())).start() s.enter(5,1,func,('sssss', time.time())) print '10秒前',time.time() time.sleep(10) print '10秒后',time.time() Timer(3, func, ('world', time.time())).start()