最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python快速實現(xiàn)定時器的五種常見方法詳解

 更新時間:2025年07月30日 10:17:03   作者:TIM老師  
這篇文章主要為大家詳細介紹了使用Python語言快速實現(xiàn)定時器的五種常見方法,分為內(nèi)置方法 與 第三方庫的方法,感興趣的小伙伴可以了解下

1.sleep法(阻塞)

通過 while + sleep 實現(xiàn)定時任務(wù)

(1) 存在時間漂移(等待運行時間)

import time
def loopMonitor():
    while True:
        MonitorSystem()
        # 1min檢查一次
        time.sleep(60)
loopMonitor()

(2) 維護sleep時間

import time
def loopMonitor():
    while True:
        MonitorSystem()
        #2s檢查一次
        time.sleep(60.0 - ((time.time() - starttime) % 60.0))
loopMonitor()

2.自定義法 (+線程、非阻塞)

import threading 
import time
 
class RepeatedTimer(object):
  def __init__(self, interval, function, *args, **kwargs):
    self._timer = None
    self.interval = interval
    self.function = function
    self.args = args
    self.kwargs = kwargs
    self.is_running = False
    self.next_call = time.time()
    self.start()
 
  def _run(self):
    self.is_running = False
    self.start()
    self.function(*self.args, **self.kwargs)
 
  def start(self):
    if not self.is_running:
      self.next_call += self.interval
      self._timer = threading.Timer(self.next_call - time.time(), self._run)
      self._timer.start()
      self.is_running = True
 
  def stop(self):
    self._timer.cancel()
    self.is_running = False
    
    
from time import sleep
def hello(name):
    print "Hello %s!" % name
 
print "starting..."
rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
try:
    sleep(5) # your long-running job goes here...
finally:
    rt.stop() # better in a try/finally block to make sure the program ends!

3.Twisted

更加健壯,并且實現(xiàn)了許多功能:守護進程、日志記錄或異常處理

from twisted.internet import task, reactor
 
timeout = 60.0 # Sixty seconds
 
def doWork():
    #do work here
    pass
 
l = task.LoopingCall(doWork)
l.start(timeout) # call every sixty seconds
 
reactor.run()

4.schedule (簡單方便,推薦)

import schedule
import time
 
def job():
    print("I'm working...")
 
#schedule.every(1)創(chuàng)建Job, seconds.do(func)按秒間隔查詢并執(zhí)行
schedule.every(1).seconds.do(func)
#添加任務(wù)按分執(zhí)行
schedule.every(1).minutes.do(func)
#添加任務(wù)按天執(zhí)行
schedule.every(1).days.do(func)
#添加任務(wù)按周執(zhí)行
schedule.every().weeks.do(func)
#添加任務(wù)每周一執(zhí)行,執(zhí)行時間為下周一這一時刻時間
schedule.every().monday.do(func)
 
 
schedule.every().monday.at("12:00").do(job)
# 每隔10分鐘執(zhí)行一次任務(wù)
schedule.every(10).minutes.do(job)
# 每隔一小時執(zhí)行一次任務(wù)
schedule.every().hour.do(job)
# 每天10:30執(zhí)行一次任務(wù)
schedule.every().day.at("10:30").do(job)
# 每隔5到10分鐘運行一次任務(wù)?
schedule.every(5).to(10).minutes.do(job)
# 每周一的這個時候執(zhí)行一次任務(wù)
schedule.every().monday.do(job)
# 每周三 13:15執(zhí)行一次任務(wù)
schedule.every().wednesday.at("13:15").do(job)
# # 每分鐘的第17秒執(zhí)行任務(wù)  
schedule.every().minute.at(":17").do(job)
 
while True:
    schedule.run_pending()   # 檢測是否有到期任務(wù)
    time.sleep(1)  # 避免一直查詢cpu過高。sleep時間不應(yīng)該小于執(zhí)行時間,否則會線程堆積。

5.Apscheduler (功能多,推薦)

調(diào)度器(scheduler)

BlockingScheduler: 調(diào)度器在當前進程的主線程中運行,會阻塞當前線程。

BackgroundScheduler: 調(diào)度器在后臺線程中運行,不會阻塞當前線程。

AsyncIOScheduler: 結(jié)合asyncio模塊一起使用。

GeventScheduler: 程序中使用gevent作為IO模型和GeventExecutor配合使用。

TornadoScheduler: 程序中使用Tornado的IO模型,用 ioloop.add_timeout 完成定時喚醒。

TwistedScheduler: 配合TwistedExecutor,用reactor.callLater完成定時喚醒。

QtScheduler: 應(yīng)用是一個Qt應(yīng)用,需使用QTimer完成定時喚醒。

觸發(fā)器(trigger)

date是最基本的一種調(diào)度,作業(yè)任務(wù)只會執(zhí)行一次。

interval觸發(fā)器,固定時間間隔觸發(fā)。

cron 觸發(fā)器,在特定時間周期性地觸發(fā),和Linux crontab格式兼容。它是功能最強大的觸發(fā)器。

作業(yè)存儲(job store)

添加任務(wù),有兩種添加方法,一種add_job(), 另一種是scheduled_job()修飾器來修飾函數(shù)。

from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler 
scheduler = BlockingScheduler() 
 
# 第一種 
@scheduler.scheduled_job(job_func, 'interval', seconds=10) 
def timed_task():     
    print(datetime.now().strftime("%Y-%m-%d %H:%M:%S")) 
    
# 第二種 
scheduler.add_job(timed_task, 'interval', seconds=5) 
scheduler.start() 

刪除任務(wù),兩種方法:remove_job() 和 job.remove()。remove_job()是根據(jù)任務(wù)的id來移除,所以要在任務(wù)創(chuàng)建的時候指定一個 id。job.remove()則是對任務(wù)執(zhí)行remove方法。

scheduler.add_job(job_func, 'interval', seconds=20, id='one') 
scheduler.remove_job(one) 
 
task = add_job(task_func, 'interval', seconds=2, id='job_one') 
task.remvoe() 

獲取任務(wù)列表,通過scheduler.get_jobs()方法能夠獲取當前調(diào)度器中的所有任務(wù)的列表

tasks = scheduler.get_jobs() 

關(guān)閉任務(wù),使用scheduler.shutdown()默認情況下調(diào)度器會等待所有正在運行的作業(yè)完成后,關(guān)閉所有的調(diào)度器和作業(yè)存儲。

scheduler.shutdown() 
scheduler.shutdown(wait=false) 

注意點

時區(qū)問題

報錯:ValueError: Timezone offset does not match system offset: 0 != 28800. Please, check your config files.

分析:通過分析異常日志,發(fā)現(xiàn)APScheduler的默認timezone,而“0”是獲取的系統(tǒng)環(huán)境變量的TZ時間28800對應(yīng)timezone為“Asia/Shanghai”, 而0對應(yīng)timezone為“UTC”,所以需將系統(tǒng)環(huán)境變量的時區(qū)與APScheduler的時區(qū)設(shè)置為一致。

解決:

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
from apscheduler.schedulers.background import BackgroundScheduler    
import os
 
os.environ['TZ']= "Asia/Shanghai"
scheduler = BackgroundScheduler(timezone="Asia/Shanghai")

其他解決方案:

如果部署應(yīng)用dockerfile配置,也可以在dockerfile中設(shè)定系統(tǒng)時區(qū)。

到此這篇關(guān)于Python快速實現(xiàn)定時器的五種常見方法詳解的文章就介紹到這了,更多相關(guān)Python定時器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python給你的頭像加上圣誕帽

    Python給你的頭像加上圣誕帽

    這篇文章主要為大家詳細介紹了Python給你的頭像加上圣誕帽 ,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 使用python驗證代理ip是否可用的實現(xiàn)方法

    使用python驗證代理ip是否可用的實現(xiàn)方法

    驗證代理IP是否可用。原理是使用代理IP訪問指定網(wǎng)站,如果返回狀態(tài)為200,表示這個代理是可以使用的。這篇文章重點給大家介紹使用python驗證代理ip是否可用的實現(xiàn)方法,感興趣的朋友一起看看吧
    2018-07-07
  • Python queue模塊的用法

    Python queue模塊的用法

    本文主要介紹了Python queue模塊的用法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 實例Python處理XML文件的方法

    實例Python處理XML文件的方法

    這篇文章主要介紹了實例Python處理XML文件的方法,包括用Python處理XML大文件的情況,需要的朋友可以參考下
    2015-08-08
  • Python爬蟲抓取技術(shù)的一些經(jīng)驗

    Python爬蟲抓取技術(shù)的一些經(jīng)驗

    這篇文章主要介紹了Python爬蟲抓取技術(shù)的一些經(jīng)驗,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Python使用gmplot創(chuàng)建動態(tài)地圖可視化

    Python使用gmplot創(chuàng)建動態(tài)地圖可視化

    gmplot 是一個 Python 庫,用于基于 Google Maps 的靜態(tài)地圖生成可視化,它提供簡單的 API 來繪制標記、路徑、熱力圖等地理信息數(shù)據(jù),本文給大家介紹了如何使用 gmplot 在 Python 中創(chuàng)建動態(tài)地圖可視化,需要的朋友可以參考下
    2024-12-12
  • 通過底層源碼理解YOLOv5的Backbone

    通過底層源碼理解YOLOv5的Backbone

    yolov5的特征提取網(wǎng)絡(luò)兼顧速度與精度,將PAN與PFN深度融合,對不同尺度魯棒性強,可以即插即用,后接不同的檢測器,下面這篇文章主要給大家介紹了關(guān)于如何通過底層源碼理解YOLOv5的Backbone的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Python使用PyAutoGUI模擬鼠標鍵盤操作實現(xiàn)消息發(fā)送

    Python使用PyAutoGUI模擬鼠標鍵盤操作實現(xiàn)消息發(fā)送

    本文介紹了如何使用Python的PyAutoGUI庫模擬鼠標和鍵盤操作,以微信為例,自動打開軟件、搜索好友、輸入消息和發(fā)送消息,通過本文,讀者可以了解PyAutoGUI的核心思路,需要的朋友可以參考下
    2026-04-04
  • python實現(xiàn)五子棋小程序

    python實現(xiàn)五子棋小程序

    這篇文章主要為大家詳細介紹了python實現(xiàn)五子棋小程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Python實現(xiàn)修改字體字形和提取矢量數(shù)據(jù)

    Python實現(xiàn)修改字體字形和提取矢量數(shù)據(jù)

    字體設(shè)計與分析是NLP和視覺領(lǐng)域的交叉應(yīng)用,而**fontTools** 是一款強大的Python庫,可以讓我們直接操作字體文件的底層結(jié)構(gòu),本文將通過兩個實用函數(shù),展示如何修改特定字形和提取所有字形的矢量數(shù)據(jù),幫助開發(fā)者快速上手字體編輯與分析
    2025-06-06

最新評論

德州市| 赣榆县| 杭锦后旗| 和龙市| 陵川县| 勐海县| 柘荣县| 江孜县| 河津市| 沁阳市| 瓮安县| 石泉县| 济宁市| 高州市| 梨树县| 瑞安市| 屏南县| 绥芬河市| 丽水市| 阿城市| 汾阳市| 朝阳市| 镇坪县| 唐山市| 察隅县| 丹江口市| 天等县| 聊城市| 额尔古纳市| 舟曲县| 丁青县| 樟树市| 镇安县| 漳州市| 手游| 颍上县| 霍林郭勒市| 历史| 宜章县| 穆棱市| 大田县|