最近手把手教妹子寫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這個第三方庫,語法比較友好