当前位置: 首页 > 编程日记 > 正文

python 定时任务

Python 定时任务

最近学习到了 python 中两种开启定时任务的方法,和大家分享一下心得。

  • sched.scheduler()
  • threading.Timer()

sched 定时任务

使用sched的套路如下:

s = sched.scheduler(time.time, time.sleep)
s.enter(delay, priority, func1, (arg1, arg2, ...))
s.enter(delay, priority, func2, (arg1, arg2, arg3, ...))
s.run()

第一步新建一个调度器;

第二步添加任务,可以添加多个任务;

第三步让调度器开始运行。

第二步各参数含义:

  • delay 相对于调度器添加这个任务时刻的延时,以秒为单位;
  • priority 优先级,数字越小优先级越高;
  • func1 任务函数
  • (arg1, arg2, ...) 任务函数的参数
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()
----------  两个简单的例子  -------------
程序启动时刻: 1481731389.4
任务执行的时刻 1481731390.4 传达的消息是 hello 任务建立时刻 1481731389.4
任务执行的时刻 1481731392.41 传达的消息是 world 任务建立时刻 1481731389.4
睡眠2秒前时刻: 1481731392.41
睡眠2秒结束时刻: 1481731394.41----------  两个复杂的例子  -------------
睡眠7秒前时刻: 1481731394.41
睡眠7秒结束时刻: 1481731401.42
睡眠6秒前时刻: 1481731401.42
睡眠6秒结束时刻: 1481731407.42
任务执行的时刻 1481731407.42 传达的消息是 hello world [3] 任务建立时刻 1481731394.41
任务执行的时刻 1481731416.43 传达的消息是 hello world [15] 任务建立时刻 1481731401.42
程序结束时刻 1481731416.43

自调任务1

任务快结束时利用 scheduler 又重新调用自己让自己“活过来”。

# 计数器,一个循环任务,总共让自己执行3次
total = 0 
# 第二个工作函数,自调任务,自己开启定时并启动。
def worker2(msg, starttime):global totaltotal += 1print u'当前时刻:', time.time(), '消息是:', msg, ' 启动时间是:', starttime# 只要没有让自己调用到第3次,那么继续重头开始执行本任务if total < 3:# 这里的delay 可以重新指定s.enter(5, 2, worker2, ('perfect world %d' % (total), time.time()))s.run()print u'程序开始时刻:', time.time()
# 开启自调任务
s.enter(5, 2, worker2, ('perfect world %d' % (total), time.time()))
s.run()
print u'程序结束时刻:', time.time()
程序开始时刻: 1481731439.42
当前时刻: 1481731444.43 消息是: perfect world 0  启动时间是: 1481731439.42
当前时刻: 1481731449.44 消息是: perfect world 1  启动时间是: 1481731444.43
当前时刻: 1481731454.44 消息是: perfect world 2  启动时间是: 1481731449.44
程序结束时刻: 1481731454.44

Threading.Timer() 定时任务

from threading import Timer
import timedef func(msg, starttime):print u'程序启动时刻:', starttime, '当前时刻:', time.time(), '消息内容 --> %s' % (msg)# 下面的两个语句和上面的 scheduler 效果一样的
Timer(5, func, ('hello', time.time())).start()
Timer(3, func, ('world', time.time())).start()
程序启动时刻: 1481731467.28 当前时刻: 1481731470.28 消息内容 --> world
程序启动时刻: 1481731467.28 当前时刻: 1481731472.28 消息内容 --> hello

循环任务2

利用 threading.Timer() 建立的自调任务

count = 0
def loopfunc(msg,starttime):global countprint u'启动时刻:', starttime, ' 当前时刻:', time.time(), '消息 --> %s' % (msg)count += 1if count < 3:Timer(3, loopfunc, ('world %d' % (count), time.time())).start()Timer(3, loopfunc, ('world %d' % (count), time.time())).start()
启动时刻: 1481731476.35  当前时刻: 1481731479.35 消息 --> world 0
启动时刻: 1481731479.35  当前时刻: 1481731482.35 消息 --> world 1
启动时刻: 1481731482.35  当前时刻: 1481731485.35 消息 --> world 2

转载于:https://www.cnblogs.com/LinTeX9527/p/6181523.html

相关文章:

思科AP与交换机端口的配置

思科AP与交换机端口的配置。 思科AP可以分IOS AP 和LAP。 1、IOS AP 中如果AP上需要创建多个SSID&#xff0c;连接的交换机端口则需要&#xff1a; switch(config-interfa)# sw mod trunk switch(config-interfa)# sw trunk allow vlan 1,x,x,x (SSID对应的VLAN) 另外注意&…

Namespace(命名空间)的使用

作者&#xff1a;飞刀 关于Namespace(命名空间)的使用常用<% Import Namespace"System.Data" %>,这是在引用M$为我们提供的Namespace,这和ASP不同的&#xff0c;我们贏SP.net必须先引用与我们操作有关的Namespace后才能使用相应的功能。其实说白了&#xff…

“编程能力差!90%输在这点上”谷歌AI专家:其实都是瞎努力!

最近几年&#xff0c;我看过市面上很多 Python和人工智能的教程&#xff0c;基本都在这样讲&#xff1a;先介绍Python基本语法、dict、tuple 等基本库的使用&#xff0c;最后学习机器学习、深度学习的常用算法......但我与Google人工智能开发专家彭靖田老师沟通后发现&#xff…

NAS存储对称和非对称结构之前的区别概述

传统的系统利用紧耦合对称架构&#xff0c;这种架构的设计旨在解决HPC&#xff08;高性能计算、超级运算&#xff09;问题&#xff0c;现在其正在向外扩展成为云存储从而满足快速呈现的市场需求。下一代架构已经采用了松弛耦合非对称架构&#xff0c;集中元数据和控制操作&…

Lucene:基于Java的全文检索引擎简介(转载)

Lucene是一个基于Java的全文索引工具包。基于Java的全文索引引擎Lucene简介&#xff1a;关于作者和Lucene的历史全文检索的实现&#xff1a;Luene全文索引和数据库索引的比较中文切分词机制简介&#xff1a;基于词库和自动切分词算法的比较具体的安装和使用简介&#xff1a;系统…

昨天,我用 Python 写了一个婚介模型

作者 | 天元浪子来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;先声明一下&#xff1a;本文纯属七夕应景娱乐之作。如果有人因为遵循本模型提出的择偶理论而导致失恋或单身&#xff0c;除了同情&#xff0c;我不能补偿更多。在中国的传统节日里&#xff0c;七夕可…

WCF服务一:WCF服务简介

一、回顾开发历史&#xff1a; 软件架构的设计经历了&#xff1a;从面向对象程序&#xff0c;到面向组件程序设计&#xff0c;再到面向服务程序设计。这三种方式都致力于同一个目标&#xff1a;封装和重用。 面向对象程序设计&#xff1a;类封装功能并提供代码重用。 面向组件程…

MIT 更新最大自然灾害图像数据集,囊括 19 种灾害事件

作者 | 神经小兮来源 | HyperAI超神经&#xff08;ID&#xff1a;HyperAI&#xff09;内容提要&#xff1a;麻省理工学院在最近 ECCV 2020 上提交的一篇论文中&#xff0c;发布了一套自然灾害图像数据集。这是迄今为止规模最大、质量最高的自然灾害卫星图像数据集。2020 年&…

DataBind数据核心

作者&#xff1a;飞刀 这一节主要是要讲DataBind&#xff0c;这个在ASP.net中是很重要的东东&#xff0c;几乎所有的控件都需要它来控制数据的操作。也可以说是ASP.net的数据核心。 我们先来看一个简单的例子&#xff1a; <% Page Language"C#" %> <% …

convertViewsetTag方法的一点理解

转自&#xff1a;http://blog.163.com/freemanls126/blog/static/164585061201171210504864/ 前言 首先我们要知道setTag方法是干什么的&#xff0c;SDK解释为 Tags Unlike IDs, tags are not used to identify views. Tags are essentially an extra piece of information tha…

iOS使用Security.framework进行RSA 加密解密签名和验证签名

iOS 上 Security.framework为我们提供了安全方面相关的api&#xff1b; Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有&#xff1a;512&#xff0c;768&#xff0c;1024&#xff0c;2048位支持的RSA 填充方式有三种&#xff1a;NOPadding,PKCS1,OAEP 三…

Android APK反编译详解(附图)

这段时间在学Android应用开发&#xff0c;在想既然是用Java开发的应该很好反编译从而得到源代码吧&#xff0c;google了一下&#xff0c;确实很简单&#xff0c;以下是我的实践过程。 在此郑重声明&#xff0c;贴出来的目的不是为了去破解人家的软件&#xff0c;完全是一种学习…

你不知道的18个Python高效编程技巧

来源 | Python编程时光初识Python语言&#xff0c;觉得python满足了我上学时候对编程语言的所有要求。python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c的人&#xff0c;兴奋的不行不行的&#xff0c;终于解脱了。高级语言&#xff0c;如果做不到这样&#xff0c…

Alisql源码编译安装(详细篇)

前言 AliSQL 在 2016 云栖大会宣布开放源代码之后&#xff0c;迅速就获得了广泛的关注&#xff0c;目前(2016-10-27) star 数目已达 1187&#xff0c;欢迎访问 AliSQL GitHub 项目关注。社区反应也非常活跃&#xff0c;在 Issue 中提了不少反馈建议&#xff0c;其中有一部分是和…

如何给DataGrid添加自动增长列

作者&#xff1a; cuike519的专栏 http://blog.csdn.net/cuike519/我想我们都知道在数据库中如何添加自增长列&#xff0c;我们可以将这个自增长列绑定到DataGrid上使得用户方便的知道现在是第几行&#xff0c;今天我介绍一种不用数据库就可以简单显示出自增长列的方法&…

达摩院NLP团队斩获六项世界冠军背后,让AI没有难懂的语言

2018年末&#xff0c;BERT横空出世&#xff0c;它采用自编码对句子进行表示&#xff0c;通过预测掩盖词和上下句之间的关系作为语言模型学习任务&#xff0c;使用更多的数据&#xff0c;更大的模型&#xff0c;在多个自然语言处理&#xff08;NLP&#xff09;任务中显著超越之前…

提权巧用RAR.EXE

rar.exe是什么&#xff1f;它就是大名鼎鼎的winrar自带的命令行解压程序。在提权中我们经常要下载各种敏感文件&#xff0c;比如:SU目录。你想一下&#xff0c;如果su目录文件这么多&#xff0c;难道你要一个个的下载&#xff1f;&#xff1f;这明显就很麻烦&#xff0c;有了ra…

OSGI企业应用开发(二)Eclipse中搭建Felix运行环境

上篇文章介绍了什么是OSGI以及使用OSGI构建应用的优点&#xff0c;接着介绍了两款常用的OSGI实现&#xff0c;分别为Apache Felix和Equinox&#xff0c;接下来开始介绍如何在Eclipse中使用Apache Felix和Equinox搭建OSGI运行环境。 一、搭建Apache Felix运行环境 上篇文章中介绍…

马斯克脑机接口、BrainOS相继发布,不努力也能有出路了

作者 | 马超责编 | Carol封图 | CSDN 下载自视觉中国在北京时间的8月29日凌晨&#xff0c;钢铁侠埃隆马斯克投资1亿多美元的脑机接口初创公司公司Neuralink&#xff08;http://www.neurolink.company/&#xff09;进行了一次现场发布会&#xff0c;展示新一代的脑机接口设备。这…

C语言单向链表的实现

一个简单结点的结构体表示为&#xff1a;struct note{int data&#xff1b; /*数据成员可以是多个不同类型的数据*/struct note *next&#xff1b; /*指针变量成员只能是-个*/}&#xff1b; 一个简单的单向链表的图示1&#xff0e;链表是结构、指针相结合…

Java开发常用Linux命令

1.查找文件 find / -name filename.txt根据名称查找/目录下的filename.txt文件。 find . -name "*.xml"递归查找所有的xml文件 find . -name "*.xml" |xargs grep "hello world"递归查找所有文件内容中包含hello world的xml文件 grep -H spring …

数据库开发基本操作-安装Sql Server 2005出现“性能监视器计数器要求”错误解决方法...

今天在安装SQL Server 2005时&#xff0c;出现“性能监视器计数器要求”错误&#xff0c;因为以前出现过这种错误&#xff0c;得到了解决。今天又又出现这种错误&#xff0c;但并不是很清楚当时的解决办法&#xff0c;所以这次把解决方法记录下来&#xff0c;供自己以后参考&am…

华为昇腾师资培训沙龙·南京场 |华为昇腾 ACL 语言开发实践全程干货来了!看完就实操系列...

自今年疫情以来&#xff0c;AI 技术加速进入了人们的视线&#xff0c;在抗疫过程中发挥了重要作用&#xff0c;产业发展明显提速&#xff0c;我国逐步走出了一条由需求导向引领商业模式创新、市场应用倒逼基础理论和关键技术创新的发展道路&#xff0c;AI 人才的争夺战也正式打…

设计模式之C#实现---Builder

作者&#xff1a;cuike519的专栏 http://blog.csdn.net/cuike519/我们将要介绍一个和它比较像的创建型模式 Builder &#xff08;至于关于 Builder 的详细内容您可以参考 GOF 的书&#xff0c;在这里不重复了。&#xff09;。在 GOF 的书里 Builder 的目的是这样的&#xff1…

微信小程序开发之不能使用eval函数的问题

2019独角兽企业重金招聘Python工程师标准>>> 一 eval函数问题 JavaScript中的eval函数是颇受开发者争议的问题之一&#xff0c;问题主要在于其可能导致的不安全性。有关此方面问题&#xff0c;在此不再赘述&#xff0c;读者可能很容易地浏览到许多介绍性文章。 但是…

设计模式之C#实现--FactoryMethod

作者&#xff1a;cuike519的专栏 http://blog.csdn.net/cuike519/工厂方法的目的很明确就是定义一个用来创建对象的接口&#xff0c;但是他不直接创建对象&#xff0c;而由他的子类来创建&#xff0c;这样一来就将创建对象的责任推迟到了该接口的子类中&#xff0c;创建什么类…

美国AI博士指出,自学Python到底能做什么

我见过市面上很多的 Python 讲解教程和书籍&#xff0c;他们大都这样讲 Python 的&#xff1a;先从 Python 的发展历史开始&#xff0c;介绍 Python 的基本语法规则&#xff0c;Python 的 list, dict, tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0…

关于微博溯源的后续问题

1、在进行关键词搜索的时候&#xff0c;如何分词&#xff0c;我们不可能用语料库进行匹配&#xff0c;已没有语料可以学习。 2、关于转折点的寻找。目前我们使用高级搜索&#xff0c;从当前时间往前推&#xff0c;根据搜索到微博的条数变化&#xff0c;确定时间发生具体时间&am…

python3的数据类型以及模块的含义

python3的数据类型以及模块的含义购物车转载于:https://blog.51cto.com/11834445/1884901

设计模式之C#实现---- ProtoType

作者&#xff1a; cuike519的专栏 http://blog.csdn.net/cuike519/该模式的意图是&#xff1a;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。那么首先我们应该已经有了一个对象&#xff0c;同时这个对象还支持自我复制&#xff08;科隆&…