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 去执行就行了 😄 如果需要循环执行,可以考虑用 schedule 这个第三方库,语法比较友好
Tag:
python