(转)深入学习python (六) 用sched来定时执行任务

先说一下,time.sleep()来让程序休眠叉叉秒,即运行到这个地方,程序将释放CPU,过了预设的叉叉秒后,程序继续运行。

看一个简单的例子,我最喜欢以最原始简单的例子来阐述一个东西。

 
  1. import time

  2.  
  3. for i in range(5):

  4. print i

  5. time.sleep(10)


这个程序的结果就是,每隔10s钟输出一下i变量的值。(这个例子似乎不用解释就能明白time.sleep()是如何工作的。

这个方法虽然简单,但是只能用来实现简单的例子。(不过我觉得用这个方法也是行的,如果要求不是太苛刻)

现在步入主题,来说一个更高级一些的sched方法来定时执行任务。

 
  1. import time

  2. import sched

  3.  
  4. schedule = sched.scheduler ( time.time, time.sleep )

  5.  
  6. def func(string1,float1):

  7. print "now is",time.time()," | output=",string1,float1

  8.  
  9. print time.time()

  10. schedule.enter(2,0,func,("test1",time.time()))

  11. schedule.enter(2,0,func,("test1",time.time()))

  12. schedule.enter(3,0,func,("test1",time.time()))

  13. schedule.enter(4,0,func,("test1",time.time()))

  14. schedule.run()

  15. print time.time()

这个例子的输出结果是:

 
  1. 1393645450.07

  2. now is 1393645452.07 | output= test1 1393645450.07

  3. now is 1393645452.07 | output= test1 1393645450.07

  4. now is 1393645453.07 | output= test1 1393645450.07

  5. now is 1393645454.07 | output= test1 1393645450.07

  6. 1393645454.07

首先说分析一下,schedule是一个对象,每次等于它后面的那个就行了,

schedule这个家伙就像一个预存你要定时执行的任务们儿 的盒子。 schedule.enter就是把你要定时多少秒后执行的任务放到这个盒子里去。而schedule.run就是这时候去run你盒子的所有任务,任务就在这个时刻后,依次相对于这个时刻点的多少秒后运行。如果没有run,那可是不会让盒子的任务被执行。

为什么每一行输出的最后一个时间数据都是一样的(除了最后一行)?因为他们传入函数的数据是当时运行schedule.enter的那个时间点,并非是你定时运行的那个时刻。

而输出中“now is  什么什么”的那个时刻,是运行的func函数中的time.time(),所以代表的是实际运行那个任务的时刻,所以不是一样的。

接着,就具体说一下schedule.enter这个对象方法的具体api应用说明

schedule是一个对象,名称是其他的都行,只要是这一号任务即可,别搞个字符串来.enter就行了。(这篇教程写得还是比较面向初学者,废话挺多)

schedule.enter(delay, priority, action, arguments)

第一个参数是一个整数或者float,代表多少秒后执行这个action任务。

第二个参数priority是优先级,0代表优先级最高,1次之,2次次之…当两个任务是预定在同一个时刻执行时,根据优先级决定谁先执行。

第三个参数就是你要执行的任务,可以简单的理解成你要执行的函数的函数名。

第四个参数是你要传入的这个定时执行的action为函数名的函数的参数,最好是用"()"括号来包起来,包起来肯定是不会出错的。其次,当你只传入一个参数时,用括号包起来后,一定要记住再打上一个逗号。即:schedule.enter(delay, priority, action, (argument1,))             虽然看起来有有点怪,但一定要这样,否则,会出现错误,比如你不打逗号,你传入一个字符串,它会以为你传入的是一个个字符,且每个字符的地位等于一个参数。总之切记,打上逗号,就安全了。否则会出问题的。 另外如果没有参数要传入,就直接传入空括号即可,即:schedule.enter(delay, priority, action, () )

--------------------- 本文来自 Jerk_Zhang 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/jerk_zhang/article/details/20216569?utm_source=copy

猜你喜欢

转载自blog.csdn.net/qiqiyingse/article/details/82865870
今日推荐