本文简单介绍了Python定时执行一段代码的方法

最近手把手教妹子写Python,被一篇博客误导了,这里记录一下。

妹子需要的是一个定时闹钟,到点往钉钉群里推个消息。她一顿搜索猛如虎,参照着其他人的博客,搞了一个while:

  1. target_time = mktime(time.strptime("2019-5-29 15:30:00", "%Y-%m-%d %H:%M:%S"))
  2. while True:
  3. now = time.time()
  4. if now > target_time:
  5. print(u"到点")
  6. break

这种没啥技术含量的代码,居然有人堂而皇之写在博客里,简直是误导嘛。。。跑起来以后CPU一个核就在空跑,等着时间到了,跟睡眠排序的xx程度可以一拼

 

于是先让妹子搞好发钉钉的代码,封装一个给文本就能推钉钉机器人的小函数出来:

  1. import requests
  2. import json
  3. def _notify_dd(text):
  4. ding_msg = {
  5. "msgtype": "text",
  6. "text":
  7. {
  8. "content": text,
  9. "title":" title"
  10. }
  11. }
  12. robotUrl = "xxxx" #自己填钉钉机器人url
  13. headers = {"Content-Type":"application/json"}
  14. requests.post(robotUrl, data = json.dumps(ding_msg), headers = headers)

接下来就是定时器的部分,之前我是想着给她开一个Linux用户,然后用crontab跑。后来发现Python有个模块sched,可以定时执行,示例代码:

  1. import sched, time
  2. s = sched.scheduler(time.time, time.sleep)
  3. def print_time(a=\'default\'):
  4. print("From print_time", time.time(), a)
  5. def print_some_times():
  6. print(time.time())
  7. s.enter(10, 1, print_time)
  8. s.enter(5, 2, print_time, argument=(\'positional\',))
  9. s.enter(5, 1, print_time, kwargs={\'a\': \'keyword\'})
  10. s.run()

这里调了:sched.scheduler、s.enter、s.run三个方法。第一个方法是创建一个调度器,采用time.sleep阻塞等待,time.time返回当前时间。s.enter是插入定时执行事件,第一个参数是需要等待的时间,第二个参数是优先级,时间相同按优先级执行,第三个是需要执行的函数action,后面的参数是传给action的参数。第三个s.run是执行阻塞,等待事件执行

 

最后,只要结合time.mktime来算下目标时间的时间戳,然后和当前时间相减算下等待时间,交给sched去执行就行了

版权声明:本文为Lifehacker原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Lifehacker/p/python_crontab.html