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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

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

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

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

1

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

from datetime import datetime

import time

'''每個 10 秒打印當(dāng)前時間。'''

def timedTask():

while True:

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

time.sleep(10)

if __name__ == '__main__':

timedTask()

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

2

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

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

from datetime import datetime

from threading import Timer

import time

'''

每個 10 秒打印當(dāng)前時間。

'''

def timedTask():

'''

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

第二個參數(shù): 要執(zhí)行的任務(wù), 即函數(shù)

第三個參數(shù): 調(diào)用函數(shù)的參數(shù)(tuple)

'''

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

# 定時任務(wù)

def task():

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

if __name__ == '__main__':

timedTask()

while True:

print(time.time())

time.sleep(5)

運行結(jié)果:

1512486945.1196375

1512486950.119873

2017-12-05 23:15:50

1512486955.133385

3

第三種方式是也是使用標(biāo)準(zhǔn)庫中sched模塊。sched 是事件調(diào)度器,它通過 scheduler 類來調(diào)度事件,從而達(dá)到定時執(zhí)行任務(wù)的效果。

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

1)首先構(gòu)造一個sched.scheduler類

它接受兩個參數(shù):timefunc 和 delayfunc。timefunc 應(yīng)該返回一個數(shù)字,代表當(dāng)前時間,delayfunc 函數(shù)接受一個參數(shù),用于暫停運行的時間單元。

一般使用默認(rèn)參數(shù)就行,即傳入這兩個參數(shù) time.time 和 time.sleep.當(dāng)然,你也可以自己實現(xiàn)時間暫停的函數(shù)。

2)添加調(diào)度任務(wù)

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

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

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

3)把任務(wù)運行起來

調(diào)用 scheduler.run()函數(shù)就完事了。

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

from datetime import datetime

import sched

import time

'''

每個 10 秒打印當(dāng)前時間。

'''

def timedTask():

# 初始化 sched 模塊的 scheduler 類

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

# 增加調(diào)度任務(wù)

scheduler.enter(10, 1, task)

# 運行任務(wù)

scheduler.run()

# 定時任務(wù)

def task():

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

if __name__ == '__main__':

timedTask()

值得注意的是: scheduler 中的每個調(diào)度任務(wù)只會工作一次,不會無限循環(huán)被調(diào)用。如果想重復(fù)執(zhí)行同一任務(wù), 需要重復(fù)添加調(diào)度任務(wù)即可。

推薦閱讀:

本文原創(chuàng)發(fā)布于微信公眾號「極客猴」,歡迎關(guān)注第一時間獲取更多原創(chuàng)分享

【極客猴】每周堅持分享 Python 原創(chuàng)干貨的公眾號。包括基礎(chǔ)入門,進(jìn)階技巧,網(wǎng)絡(luò)爬蟲,數(shù)據(jù)分析, Web 應(yīng)用開發(fā)等,歡迎關(guān)注。

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。