Python的定时执行
本文简单介绍了Python定时执行一段代码的方法
最近手把手教妹子写Python,被一篇博客误导了,这里记录一下。
妹子需要的是一个定时闹钟,到点往钉钉群里推个消息。她一顿搜索猛如虎,参照着其他人的博客,搞了一个while:
- target_time = mktime(time.strptime("2019-5-29 15:30:00", "%Y-%m-%d %H:%M:%S"))
- while True:
- now = time.time()
- if now > target_time:
- print(u"到点")
- break
这种没啥技术含量的代码,居然有人堂而皇之写在博客里,简直是误导嘛。。。跑起来以后CPU一个核就在空跑,等着时间到了,跟睡眠排序的xx程度可以一拼
于是先让妹子搞好发钉钉的代码,封装一个给文本就能推钉钉机器人的小函数出来:
- import requests
- import json
- def _notify_dd(text):
- ding_msg = {
- "msgtype": "text",
- "text":
- {
- "content": text,
- "title":" title"
- }
- }
- robotUrl = "xxxx" #自己填钉钉机器人url
- headers = {"Content-Type":"application/json"}
- requests.post(robotUrl, data = json.dumps(ding_msg), headers = headers)
接下来就是定时器的部分,之前我是想着给她开一个Linux用户,然后用crontab跑。后来发现Python有个模块sched,可以定时执行,示例代码:
- import sched, time
- s = sched.scheduler(time.time, time.sleep)
- def print_time(a=\'default\'):
- print("From print_time", time.time(), a)
- def print_some_times():
- print(time.time())
- s.enter(10, 1, print_time)
- s.enter(5, 2, print_time, argument=(\'positional\',))
- s.enter(5, 1, print_time, kwargs={\'a\': \'keyword\'})
- s.run()
这里调了:sched.scheduler、s.enter、s.run三个方法。第一个方法是创建一个调度器,采用time.sleep阻塞等待,time.time返回当前时间。s.enter是插入定时执行事件,第一个参数是需要等待的时间,第二个参数是优先级,时间相同按优先级执行,第三个是需要执行的函数action,后面的参数是传给action的参数。第三个s.run是执行阻塞,等待事件执行
最后,只要结合time.mktime来算下目标时间的时间戳,然后和当前时间相减算下等待时间,交给sched去执行就行了