日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python定时任务_Python定时任务(上)

發布時間:2023/11/30 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python定时任务_Python定时任务(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在項目中,我們可能遇到有定時任務的需求。其一:定時執行任務。例如每天早上 8 點定時推送早報。其二:每隔一個時間段就執行任務。比如:每隔一個小時提醒自己起來走動走動,避免長時間坐著。今天,我跟大家分享下 Python 定時任務的實現方法。

1

第一種辦法是最簡單又最暴力。那就是在一個死循環中,使用線程睡眠函數 sleep()。

from datetime import datetime

import time

'''每個 10 秒打印當前時間。'''

def timedTask():

while True:

print(datetime.now().strftime("%Y-%m-%d%H:%M:%S"))

time.sleep(10)

if __name__ == '__main__':

timedTask()

這種方法能夠執行固定間隔時間的任務。如果timedTask()函數之后還有些操作,我們還使用死循環 + 阻塞線程。這會使得timedTask()一直占有 CPU 資源,導致后續操作無法執行。我建議謹重使用。

2

既然第一種方法暴力,那么有沒有比較優雅地方法?答案是肯定的。Python 標準庫 threading 中有個 Timer 類。它會新啟動一個線程來執行定時任務,所以它是非阻塞函式。

如果你有使用多線程的話,需要關心線程安全問題。那么你可以選使用threading.Timer模塊。

from datetime import datetime

from threading import Timer

import time

'''

每個 10 秒打印當前時間。

'''

def timedTask():

'''

第一個參數: 延遲多長時間執行任務(單位: 秒)

第二個參數: 要執行的任務, 即函數

第三個參數: 調用函數的參數(tuple)

'''

Timer(10, task, ()).start()

# 定時任務

def task():

print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

if __name__ == '__main__':

timedTask()

while True:

print(time.time())

time.sleep(5)

運行結果:

1512486945.1196375

1512486950.119873

2017-12-05 23:15:50

1512486955.133385

3

第三種方式是也是使用標準庫中sched模塊。sched 是事件調度器,它通過 scheduler 類來調度事件,從而達到定時執行任務的效果。

sched庫使用起來也是非常簡單。

1)首先構造一個sched.scheduler類

它接受兩個參數:timefunc 和 delayfunc。timefunc 應該返回一個數字,代表當前時間,delayfunc 函數接受一個參數,用于暫停運行的時間單元。

一般使用默認參數就行,即傳入這兩個參數 time.time 和 time.sleep.當然,你也可以自己實現時間暫停的函數。

2)添加調度任務

scheduler 提供了兩個添加調度任務的函數:enter(delay, priority, action, argument=(), kwargs={})

該函數可以延遲一定時間執行任務。delay 表示延遲多長時間執行任務,單位是秒。priority為優先級,越小優先級越大。兩個任務指定相同的延遲時間,優先級大的任務會向被執行。action 即需要執行的函數,argument 和 kwargs 分別是函數的位置和關鍵字參數。scheduler.enterabs(time, priority, action, argument=(), kwargs={})

添加一項任務,但這個任務會在 time 這時刻執行。因此,time 是絕對時間.其他參數用法與 enter() 中的參數用法是一致。

3)把任務運行起來

調用 scheduler.run()函數就完事了。

下面是 sche 使用的簡單示例:

from datetime import datetime

import sched

import time

'''

每個 10 秒打印當前時間。

'''

def timedTask():

# 初始化 sched 模塊的 scheduler 類

scheduler = sched.scheduler(time.time, time.sleep)

# 增加調度任務

scheduler.enter(10, 1, task)

# 運行任務

scheduler.run()

# 定時任務

def task():

print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

if __name__ == '__main__':

timedTask()

值得注意的是: scheduler 中的每個調度任務只會工作一次,不會無限循環被調用。如果想重復執行同一任務, 需要重復添加調度任務即可。

推薦閱讀:

本文原創發布于微信公眾號「極客猴」,歡迎關注第一時間獲取更多原創分享

【極客猴】每周堅持分享 Python 原創干貨的公眾號。包括基礎入門,進階技巧,網絡爬蟲,數據分析, Web 應用開發等,歡迎關注。

總結

以上是生活随笔為你收集整理的python定时任务_Python定时任务(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。