最近手把手教妹子写 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 这个第三方库,语法比较友好