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

基于Python實(shí)現(xiàn)簡(jiǎn)單的定時(shí)器詳解

 更新時(shí)間:2021年12月21日 11:37:07   作者:天元浪子  
所謂定時(shí)器,是指間隔特定時(shí)間執(zhí)行特定任務(wù)的機(jī)制。幾乎所有的編程語(yǔ)言,都有定時(shí)器的實(shí)現(xiàn)。這篇文章主要介紹的是通過(guò)Python實(shí)現(xiàn)的定時(shí)器,感興趣的可以跟隨小編學(xué)習(xí)一下

所謂定時(shí)器,是指間隔特定時(shí)間執(zhí)行特定任務(wù)的機(jī)制。幾乎所有的編程語(yǔ)言,都有定時(shí)器的實(shí)現(xiàn)。比如,Java有util.Timer和util.TimerTask,JavaScript有setInterval和setTimeout,可以實(shí)現(xiàn)非常復(fù)雜的定時(shí)任務(wù)處理。然而,牛叉到無(wú)所不能的Python,卻沒(méi)有一個(gè)像樣的定時(shí)器,實(shí)在令人難以理解。

剛?cè)腴T(mén)的同學(xué)一定會(huì)說(shuō):不是有個(gè)time.sleep嗎?定好鬧鐘睡大覺(jué),鬧鐘一響,起來(lái)干活,這不就是一個(gè)定時(shí)器嗎?沒(méi)錯(cuò),time.sleep具備定時(shí)器的基本要素,但若作為定時(shí)器使用,則有兩個(gè)致命的缺陷:一是阻塞主線程,睡覺(jué)的時(shí)候不能做任何事情;二是醒來(lái)以后需要主線程執(zhí)行定時(shí)任務(wù)——即便使用線程技術(shù),也得先由主線程來(lái)創(chuàng)建子線程。

說(shuō)到這里,熟悉線程模塊threading的同學(xué)也許會(huì)說(shuō):threading.Timer就是以線程方式運(yùn)行的呀,既不會(huì)阻塞主線程,執(zhí)行定時(shí)任務(wù)也無(wú)需主線程干預(yù),這不就是一個(gè)完美的定時(shí)器嗎?

我們先來(lái)看看threading.Timer是如何工作的。下面這段代碼演示了threading.Timer的基本用法:?jiǎn)?dòng)定時(shí)器2秒鐘后以線程方式調(diào)用函數(shù)do_something,在定時(shí)器等待的2秒鐘內(nèi),以及do_something運(yùn)行期間,主線程仍然可以做其他工作——此處是從鍵盤(pán)讀取輸入,借以阻塞主線程,以便觀察定時(shí)器的工作情況。

import time
import threading

def do_something(name, gender='male'):
    print(time.time(), '定時(shí)時(shí)間到,執(zhí)行特定任務(wù)' )
    print('name:%s, gender:%s'%(name, gender))

timer = threading.Timer(2, do_something, args=('Alice',), kwargs={'gender':'female'})
timer.start()
print(time.time(), '定時(shí)開(kāi)始時(shí)間')
input('按回車(chē)鍵結(jié)束\n') # 此處阻塞住進(jìn)程

正如我們所期待的那樣,定時(shí)器啟動(dòng)2秒鐘后,函數(shù)do_something被調(diào)用,這期間可以隨時(shí)敲擊回車(chē)鍵結(jié)束程序。這段代碼的運(yùn)行結(jié)果如下。

1627438957.4297626 定時(shí)開(kāi)始時(shí)間

按回車(chē)鍵結(jié)束

1627438959.4299397 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

從使用效果看,threading.Timer稱(chēng)得上是一款簡(jiǎn)潔易用的定時(shí)器。不過(guò),threading.Timer存在明顯的短板,那就是不支持連續(xù)的定時(shí)任務(wù),比如,每隔2秒鐘調(diào)用一次do_something函數(shù)。如果一定要用threading.Timer實(shí)現(xiàn)連續(xù)定時(shí),只能用類(lèi)似嵌套的變通方法,在do_something函數(shù)中再次啟動(dòng)定時(shí)器。

import time
import threading

def do_something(name, gender='male'):
    global timer
    timer = threading.Timer(2, do_something, args=(name,), kwargs={'gender':gender})
    timer.start()
    
    print(time.time(), '定時(shí)時(shí)間到,執(zhí)行特定任務(wù)' )
    print('name:%s, gender:%s'%(name, gender))
    time.sleep(5)
    print(time.time(), '完成特定任務(wù)' )

timer = threading.Timer(2, do_something, args=('Alice',), kwargs={'gender':'female'})
timer.start()
input('按回車(chē)鍵結(jié)束\n') # 此處阻塞住進(jìn)程

這段代碼重新定義了do_something函數(shù),在函數(shù)開(kāi)始位置啟動(dòng)下一次的定時(shí)任務(wù)。之所以放在開(kāi)始位置,是為了保證兩次定時(shí)之間的時(shí)間間隔盡可能精確。饒是如此,下面的運(yùn)行結(jié)果顯示,兩次定時(shí)之間的時(shí)間間隔比設(shè)計(jì)的2秒鐘多了大約10毫秒,且誤差是連續(xù)累計(jì)的,重復(fù)執(zhí)行100次,誤差將會(huì)超過(guò)1秒鐘。

按回車(chē)鍵結(jié)束

1627440628.683803 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627440630.6929214 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627440632.707388 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627440633.6890671 完成特定任務(wù)

1627440634.722474 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627440635.7092102 完成特定任務(wù)

1627440636.7277966 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

針對(duì)連續(xù)的定時(shí)任務(wù),threading.Timer的表現(xiàn)還算差強(qiáng)人意,只是這種嵌套的寫(xiě)法完全顛覆了代碼美學(xué)。對(duì)于像我這樣有代碼潔癖的程序員來(lái)說(shuō),是無(wú)法容忍和不可接受的。在我看來(lái),一個(gè)完美的定時(shí)器應(yīng)該滿(mǎn)足以下5個(gè)條件,具備下圖所示的結(jié)構(gòu)。

  1. 不阻塞主線程
  2. 同時(shí)支持單次定時(shí)和連續(xù)定時(shí)
  3. 以線程或進(jìn)程方式執(zhí)行定時(shí)任務(wù)
  4. 定時(shí)任務(wù)的線程或進(jìn)程的創(chuàng)建、運(yùn)行,不影響定時(shí)精度
  5. 足夠精確的定時(shí)精度,且誤差不會(huì)累計(jì)

既然Python沒(méi)有提供一個(gè)像樣的定時(shí)器,那就自己寫(xiě)一個(gè)吧。下面這個(gè)定時(shí)器,滿(mǎn)足上面提到的5個(gè)條件,最短時(shí)間間隔可以低至10毫秒,且誤差不會(huì)累計(jì)。雖然還不夠完美,但無(wú)論結(jié)構(gòu)還是精度,都還說(shuō)得過(guò)去。

import time
import threading

class PyTimer:
    """定時(shí)器類(lèi)"""
    
    def __init__(self, func, *args, **kwargs):
        """構(gòu)造函數(shù)"""
        
        self.func = func
        self.args = args
        self.kwargs = kwargs
        self.running = False
    
    def _run_func(self):
        """運(yùn)行定時(shí)事件函數(shù)"""
        
        th = threading.Thread(target=self.func, args=self.args, kwargs=self.kwargs)
        th.setDaemon(True)
        th.start()
    
    def _start(self, interval, once):
        """啟動(dòng)定時(shí)器的線程函數(shù)"""
        
        if interval < 0.010:
            interval = 0.010
        
        if interval < 0.050:
            dt = interval/10
        else:
            dt = 0.005
        
        if once:
            deadline = time.time() + interval
            while time.time() < deadline:
                time.sleep(dt)
            
            # 定時(shí)時(shí)間到,調(diào)用定時(shí)事件函數(shù)
            self._run_func()
        else:
            self.running = True
            deadline = time.time() + interval
            while self.running:
                while time.time() < deadline:
                    time.sleep(dt)
                
                # 更新下一次定時(shí)時(shí)間
                deadline += interval
                
                # 定時(shí)時(shí)間到,調(diào)用定時(shí)事件函數(shù)
                if self.running:
                    self._run_func()
    
    def start(self, interval, once=False):
        """啟動(dòng)定時(shí)器
        
        interval    - 定時(shí)間隔,浮點(diǎn)型,以秒為單位,最高精度10毫秒
        once        - 是否僅啟動(dòng)一次,默認(rèn)是連續(xù)的
        """
        
        th = threading.Thread(target=self._start, args=(interval, once))
        th.setDaemon(True)
        th.start()
    
    def stop(self):
        """停止定時(shí)器"""
        
        self.running = False

定時(shí)器類(lèi)PyTimer實(shí)例化時(shí),需要傳入定時(shí)任務(wù)函數(shù)。如果定時(shí)任務(wù)函數(shù)有參數(shù),也可以按照位置參數(shù)、關(guān)鍵字參數(shù)的順序一并提供。PyTimer定時(shí)器提供start和stop兩個(gè)方法,用于啟動(dòng)和停止定時(shí)器。其中stop方法不需要參數(shù),start則需要一個(gè)以秒為單位的定時(shí)間隔參數(shù)。start還有一個(gè)布爾型的默認(rèn)參數(shù)once,可以設(shè)置是否單次定時(shí)。once參數(shù)的默認(rèn)值為False,即默認(rèn)連續(xù)定時(shí);如果需要單次定時(shí),只需要將once置為true即可。

def do_something(name, gender='male'):
    print(time.time(), '定時(shí)時(shí)間到,執(zhí)行特定任務(wù)' )
    print('name:%s, gender:%s'%(name, gender))
    time.sleep(5)
    print(time.time(), '完成特定任務(wù)' )

timer = PyTimer(do_something, 'Alice', gender='female')
timer.start(0.5, once=False)

input('按回車(chē)鍵結(jié)束\n') # 此處阻塞住進(jìn)程
timer.stop()

上面是使用PyTimer定時(shí)器以0.5秒鐘的間隔連續(xù)調(diào)用函數(shù)do_something的例子。這段代碼的運(yùn)行結(jié)果如下。

按回車(chē)鍵結(jié)束

1627450313.425347 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450313.9226055 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450314.421761 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450314.9243422 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450315.422722 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450315.9200313 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450316.4204514 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450316.9215539 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450317.4228196 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450317.9245899 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450318.42355 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450318.4393418 完成特定任務(wù)

1627450318.9251466 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450318.9395308 完成特定任務(wù)

1627450319.4242043 完成特定任務(wù)

1627450319.4242043 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450319.9253905 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

1627450319.9411068 完成特定任務(wù)

1627450320.425871 完成特定任務(wù)

1627450320.425871 定時(shí)時(shí)間到,執(zhí)行特定任務(wù)

name:Alice, gender:female

雖然每個(gè)定時(shí)任務(wù)需要運(yùn)行5秒鐘,但每隔0.5秒都會(huì)準(zhǔn)時(shí)啟動(dòng)一個(gè)新的線程運(yùn)行定時(shí)任務(wù)。從記錄可以看出,盡管每次定時(shí)任務(wù)的啟動(dòng)時(shí)間有幾個(gè)毫秒的誤差,但誤差不會(huì)累計(jì),重復(fù)執(zhí)行的時(shí)間間隔均值始終穩(wěn)定在0.5秒。

?到此這篇關(guān)于基于Python實(shí)現(xiàn)簡(jiǎn)單的定時(shí)器詳解的文章就介紹到這了,更多相關(guān)Python定時(shí)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python自動(dòng)統(tǒng)計(jì)zabbix系統(tǒng)監(jiān)控覆蓋率的示例代碼

    python自動(dòng)統(tǒng)計(jì)zabbix系統(tǒng)監(jiān)控覆蓋率的示例代碼

    這篇文章主要介紹了python自動(dòng)統(tǒng)計(jì)zabbix系統(tǒng)監(jiān)控覆蓋率的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Python Tkinter GUI編程入門(mén)介紹

    Python Tkinter GUI編程入門(mén)介紹

    這篇文章主要介紹了Python Tkinter GUI編程入門(mén)介紹,本文講解了Tkinter介紹、Tkinter的使用、Tkinter的幾何管理器等內(nèi)容,并給出了一個(gè)完整示例,需要的朋友可以參考下
    2015-03-03
  • 在Python中合并字典模塊ChainMap的隱藏坑【推薦】

    在Python中合并字典模塊ChainMap的隱藏坑【推薦】

    在Python中,當(dāng)我們有兩個(gè)字典需要合并的時(shí)候,可以使用字典的 update 方法,接下來(lái)通過(guò)本文給大家介紹在Python中合并字典模塊ChainMap的隱藏坑,感興趣的朋友一起看看吧
    2019-06-06
  • Python模型聚合查詢(xún)\Q查詢(xún)\F查詢(xún)\分組查詢(xún)操作技巧解析

    Python模型聚合查詢(xún)\Q查詢(xún)\F查詢(xún)\分組查詢(xún)操作技巧解析

    這篇文章主要介紹了模型查詢(xún)中的一些操作技巧,主要包括模型聚合查詢(xún),Q查詢(xún),F(xiàn)查詢(xún),分組查詢(xún),有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • python matplotlib實(shí)現(xiàn)坐標(biāo)投影的示例代碼

    python matplotlib實(shí)現(xiàn)坐標(biāo)投影的示例代碼

    這篇文章主要為大家詳細(xì)介紹了python matplotlib實(shí)現(xiàn)坐標(biāo)投影,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • python畫(huà)一個(gè)圣誕樹(shù)實(shí)現(xiàn)示例

    python畫(huà)一個(gè)圣誕樹(shù)實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了使用python畫(huà)一個(gè)圣誕樹(shù)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Python實(shí)現(xiàn)CAN報(bào)文轉(zhuǎn)換工具教程

    Python實(shí)現(xiàn)CAN報(bào)文轉(zhuǎn)換工具教程

    這篇文章主要介紹了Python實(shí)現(xiàn)CAN報(bào)文轉(zhuǎn)換工具教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • pandas.DataFrame Series排序的使用(sort_values,sort_index)

    pandas.DataFrame Series排序的使用(sort_values,sort_index)

    本文主要介紹了pandas.DataFrame Series排序的使用(sort_values,sort_index),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • django有哪些好處和優(yōu)點(diǎn)

    django有哪些好處和優(yōu)點(diǎn)

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于django有哪些好處和優(yōu)點(diǎn)的相關(guān)內(nèi)容,有需要的朋友們可以參考下。
    2020-09-09
  • 在Python中存儲(chǔ)字符串

    在Python中存儲(chǔ)字符串

    這篇文章主要介紹了在Python中存儲(chǔ)字符串,文章通過(guò)unicode展開(kāi)主題相關(guān)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05

最新評(píng)論

贵阳市| 溧阳市| 开化县| 托里县| 锦州市| 澄江县| 临安市| 大埔区| 馆陶县| 鄢陵县| 庄浪县| 朝阳区| 梅州市| 弥渡县| 平远县| 黑河市| 信阳市| 那曲县| 太白县| 元阳县| 扎囊县| 保定市| 繁峙县| 疏勒县| 马公市| 德钦县| 柳林县| 蓬溪县| 南安市| 札达县| 九台市| 如东县| 定陶县| 伊宁县| 乐昌市| 迁西县| 大田县| 湘乡市| 周至县| 巧家县| 耒阳市|