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这个第三方库,语法比较友好

posted on 2019-05-29 16:37  lifehacker  阅读(2762)  评论(1编辑  收藏  举报

导航