`
cooler1217
  • 浏览: 386048 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

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

 
阅读更多

2014-3-1阅读4881 评论1

先说一下,time.sleep()来让程序[原]深入学习python (六) 用sched来定时执行任务
2014-3-1阅读4881 评论1

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

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

import time

for i in range(5):
    print i
    time.sleep(10)

这个程序的结果就是,每隔10s钟输出一下i变量的值。(这个例子似乎不用解释就能明白time.sleep()是如何工作的。
这个方法虽然简单,但是只能用来实现简单的例子。(不过我觉得用这个方法也是行的,如果要求不是太苛刻)



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

import time
import sched

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

def func(string1,float1):
    print "now is",time.time()," | output=",string1,float1

print time.time()
schedule.enter(2,0,func,("test1",time.time()))
schedule.enter(2,0,func,("test1",time.time()))
schedule.enter(3,0,func,("test1",time.time()))
schedule.enter(4,0,func,("test1",time.time()))
schedule.run()
print time.time()
这个例子的输出结果是:
1393645450.07
now is 1393645452.07  | output= test1 1393645450.07
now is 1393645452.07  | output= test1 1393645450.07
now is 1393645453.07  | output= test1 1393645450.07
now is 1393645454.07  | output= test1 1393645450.07
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, () )




最后,来说个更高级的东西,

在多线程的环境里,上面的sched方法搞出来这个schedule搞搞搞搞,会因为线程安全的问题从而存在限制,一个东西执行了,如果没结束,另外一个东西就要等。阻塞了。

而我们可以用多线程的方式,避免在一条通道上堵车。

即神器——threading.Timer类。例子如下:

import time
from threading import Timer

def print_time( enter_time ):
    print "now is", time.time() , "enter_the_box_time is", enter_time


print time.time()
Timer(5,  print_time, ( time.time(), )).start()
Timer(10, print_time, ( time.time(), )).start()
print time.time()
输出结果如下:
>>> 1393660025.58
>>> 1393660025.58
>>> now is 1393660030.58 enter_the_box_time is 1393660025.58
>>> now is 1393660035.58 enter_the_box_time is 1393660025.58

Timer就自动执行了,不需要再放到盒子里,然后一下子.run一下,另外,也不需要分优先级,可以同时处理喔,为了显示多线程同时处理的效果,可以把上面的第二个Timer的第一个参数也改成5,然后实验一下输出结果,如下:
>>> 1393660052.12
>>> 1393660052.12
>>> now isnow is 1393660057.12 enter_the_box_time is 1393660052.12
1393660057.12 enter_the_box_time is 1393660052.12

因为是同时输出,而屏幕只有一个,所以发生了混在一起的这种有些混乱的局面,这充分说明了是同时输出。威力好大吧。有个高中同位在美国读博士,就是写底层的科学家,像分布式运算、以及利用显卡的计算能力去运算,这种东西我不擅长,这哥们内功深厚啊,可惜哥老矣,哥混的是景观规划设计界,多年没有提刀编程了,感觉枯藤老树昏鸦了。想起这高中同位,历历在目,写底层,内功深厚啊。老子的专业只有景观三元论,本来挺进步的,后来就成了幽默。
最后说个网址,是sched的官方手册,http://docs.python.org/2/library/sched.html休眠叉叉秒,即运行到这个地方,程序将释放CPU,过了预设的叉叉秒后,程序继续运行。

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

import time

for i in range(5):
    print i
    time.sleep(10)

这个程序的结果就是,每隔10s钟输出一下i变量的值。(这个例子似乎不用解释就能明白time.sleep()是如何工作的。
这个方法虽然简单,但是只能用来实现简单的例子。(不过我觉得用这个方法也是行的,如果要求不是太苛刻)



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

import time
import sched

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

def func(string1,float1):
    print "now is",time.time()," | output=",string1,float1

print time.time()
schedule.enter(2,0,func,("test1",time.time()))
schedule.enter(2,0,func,("test1",time.time()))
schedule.enter(3,0,func,("test1",time.time()))
schedule.enter(4,0,func,("test1",time.time()))
schedule.run()
print time.time()
这个例子的输出结果是:
1393645450.07
now is 1393645452.07  | output= test1 1393645450.07
now is 1393645452.07  | output= test1 1393645450.07
now is 1393645453.07  | output= test1 1393645450.07
now is 1393645454.07  | output= test1 1393645450.07
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, () )




最后,来说个更高级的东西,

在多线程的环境里,上面的sched方法搞出来这个schedule搞搞搞搞,会因为线程安全的问题从而存在限制,一个东西执行了,如果没结束,另外一个东西就要等。阻塞了。

而我们可以用多线程的方式,避免在一条通道上堵车。

即神器——threading.Timer类。例子如下:

import time
from threading import Timer

def print_time( enter_time ):
    print "now is", time.time() , "enter_the_box_time is", enter_time


print time.time()
Timer(5,  print_time, ( time.time(), )).start()
Timer(10, print_time, ( time.time(), )).start()
print time.time()
输出结果如下:
>>> 1393660025.58
>>> 1393660025.58
>>> now is 1393660030.58 enter_the_box_time is 1393660025.58
>>> now is 1393660035.58 enter_the_box_time is 1393660025.58

Timer就自动执行了,不需要再放到盒子里,然后一下子.run一下,另外,也不需要分优先级,可以同时处理喔,为了显示多线程同时处理的效果,可以把上面的第二个Timer的第一个参数也改成5,然后实验一下输出结果,如下:
>>> 1393660052.12
>>> 1393660052.12
>>> now isnow is 1393660057.12 enter_the_box_time is 1393660052.12
1393660057.12 enter_the_box_time is 1393660052.12

因为是同时输出,而屏幕只有一个,所以发生了混在一起的这种有些混乱的局面,这充分说明了是同时输出。威力好大吧。有个高中同位在美国读博士,就是写底层的科学家,像分布式运算、以及利用显卡的计算能力去运算,这种东西我不擅长,这哥们内功深厚啊,可惜哥老矣,哥混的是景观规划设计界,多年没有提刀编程了,感觉枯藤老树昏鸦了。想起这高中同位,历历在目,写底层,内功深厚啊。老子的专业只有景观三元论,本来挺进步的,后来就成了幽默。
最后说个网址,是sched的官方手册,http://docs.python.org/2/library/sched.html
分享到:
评论

相关推荐

    python定时任务 sched模块用法实例

    总结来说,Python的`sched`模块提供了一种灵活的方式来安排和管理定时任务。通过设置延迟、优先级和参数,我们可以精确控制函数何时、以何种顺序以及如何执行。这在需要定时触发某些操作的场景中非常有用,如定期...

    Python定时任务sched模块用法示例

    本文实例讲述了Python定时任务sched模块用法。分享给大家供大家参考,具体如下: 通过sched模块可以实现通过自定义时间,自定义函数,自定义优先级来执行函数。 范例一 import time import sched schedule = sched....

    Python任务调度之sched.pdf

    Python的`sched`模块是一个轻量级的任务调度器,它提供了在特定时间点执行任务的能力。这个模块在一些不需要复杂的定时任务调度或者不需要与操作系统级别的定时器交互的场景下非常实用。`sched`的主要功能是通过`...

    python定时任务.docx

    本篇将深入探讨如何使用`sched`模块创建定时任务。 `sched`模块是一个事件调度器,它允许程序员按照指定的时间间隔安排事件。在这个模块中,我们首先需要创建一个`scheduler`对象,它有两个参数:`time.time()`和`...

    Python实现定时执行任务的三种方式简单示例

    本文实例讲述了Python实现定时执行任务的三种方式。分享给大家供大家参考,具体如下: 1.定时任务代码 #!/user/bin/env python # @Time :2018/6/7 16:31 # @Author :PGIDYSQ #@File :PerformTaskTimer.py #定时执行...

    浅析python实现scrapy定时执行爬虫

    使用sched模块时,首先需要创建一个scheduler对象,然后定义需要定时执行的函数,最后通过enter方法来安排任务的执行。例如: ```python import sched import time schedule = sched.scheduler(time.time, time....

    Python实现定时任务

    对于 Windows 平台,还可以考虑将 Python 脚本打包成 EXE 文件,并利用 Windows 的任务计划程序来定时执行这些脚本。这种方式适用于不需要频繁更改的定时任务,特别适合于生产环境下的部署。 **总结** 在选择合适...

    C# Quartz.Net定时任务操作明细、完整过程

    例如,每日定时执行一次: ```csharp IScheduler sched = new StdSchedulerFactory().GetScheduler(); JobDetailImpl jb1 = new JobDetailImpl("jdTest", typeof(TestQuartz)); IMutableTrigger mutableTrigger = ...

    python BlockingScheduler定时任务及其他方式的实现

    本文将重点介绍两种常见的Python定时任务实现方式:使用`BlockingScheduler`库和采用基础的编程技巧如`time.sleep()`、`threading.Timer`以及`sched`模块。 首先,我们来看看`BlockingScheduler`,它是APScheduler...

    Python标准库sched模块使用指南

    `sched`模块的灵活性在于它的通用性,适用于各种需要定时执行任务的场景。开发者可以根据需求调整事件的优先级和时间间隔,从而实现复杂的调度策略。尽管在多线程环境中有一定限制,但通过结合`threading`模块,依然...

    深入浅析python定时杀进程

    使用Python的`os.system()`执行Shell命令 Python的`os`模块提供了许多与操作系统交互的函数,其中`os.system()`可以执行系统命令,非常方便地调用上述的Shell命令来终止指定进程。 ##### 5. Python的`sched`模块...

    Quartz定时任务常用的11张数据库脚本表结构

    Quartz是一款广泛使用的开源任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在Quartz中,任务和触发器的配置信息是通过数据库存储的,这使得任务调度具有高可用性和可扩展性。这里我们将详细探讨...

    Python3中常用的处理时间和实现定时任务的方法的介绍

    无论哪种编程语言,时间肯定都是非常重要的部分,今天来看一下python如何来处理时间和python定时任务,注意咯:本篇所讲是python3版本的实现,在python2版本中的实现略有不同,有时间会再写一篇以便大家区分。...

    quartz定时执行任务,并配置web.xml的操作方法

    本文将介绍如何使用 Quartz 实现定时执行任务,并配置 web.xml 文件。 Quartz 定时执行任务 Quartz 定时执行任务可以通过使用 CronTrigger 实现,以便于在特定的时间点执行任务。CronTrigger 使用 Cron 表达式来...

    任务调度开源框架Quartz动态添加、修改和删除定时任务

    ### 任务调度开源框架Quartz动态添加、修改和删除定时任务 #### 一、Quartz框架简介 Quartz 是一个全面、...通过上述示例代码,我们不仅了解了如何使用 Quartz 来管理定时任务,还深入学习了其核心概念和技术细节。

    windows下定时重启nodejs程序

    Python的`datetime`和`sched`模块可以帮助实现定时功能,或者结合计划任务API直接设置重启时间。 实现步骤大致如下: 1. **安装Python环境**:确保Python已安装,并且在系统路径中,这样可以在批处理文件中直接...

Global site tag (gtag.js) - Google Analytics