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這個第三方庫,語法比較友好


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM