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

python中斷time.sleep一種更優(yōu)雅的方式:event.wait

 更新時(shí)間:2023年11月10日 09:00:10   作者:Rnan-prince  
這篇文章主要介紹了python中斷time.sleep一種更優(yōu)雅的方式:event.wait,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

場(chǎng)景描述

實(shí)現(xiàn)一個(gè)功能,啟動(dòng)一個(gè)線程,只要線程不中斷,就一直while true,間斷10s累加某個(gè)數(shù);

當(dāng)線程線程信號(hào)時(shí),while停止,線程退出。

1、方法一 time.sleep

import time
from threading import Thread
 
 
class AddTask(Thread):
 
    def __init__(self):
        super().__init__()
        self.sum_num = 0
        self._button = True
 
    def run(self):
        print('Begin to add ...')
        while self._button:
            print('Sleep start...')
            time.sleep(10)
            print('Sleep end...')
            self.sum_num += 10
        print(f"Finish add, sum:{self.sum_num}...")
 
    def stop(self):
        print('Stop task...')
        self._button = False
 
 
def do_main_task():
    print('Do main task...')
    time.sleep(15)
    print('Finish main task...')
    return True
 
 
if __name__ == '__main__':
    add_task = AddTask()
    add_task.start()
    main_task_end = do_main_task()
    if main_task_end:
        add_task.stop()
        time.sleep(1)
        print(f"sum: {add_task.sum_num}")

執(zhí)行結(jié)果:

Begin to add ...Do main task...
Sleep start...
Sleep end...
Sleep start...
Finish main task...
Stop task...
sum: 10
Sleep end...
Finish add,sum: 20...

解釋一下這段代碼的意思。在主線程里面,我調(diào)用do_main_task()觸發(fā)了一個(gè)任務(wù)。這個(gè)任務(wù)執(zhí)行會(huì)久一些(這里設(shè)定15s)。但是這個(gè)任務(wù)完成以后,會(huì)有個(gè)返回值,告訴我完成了。另外創(chuàng)建一個(gè) add_task 子線程,每10秒累加10。

但某些情況下,我不需要等待了,例如用戶主動(dòng)取消了任務(wù)。這個(gè)時(shí)候,我就想提前結(jié)束這個(gè) add_task 子線程。

通過(guò)執(zhí)行結(jié)果可以看出,當(dāng)執(zhí)行一次+10,等待10s后,又過(guò)了5秒,主線程do_main_task結(jié)束了,這時(shí)add_task線程還在累加的sleep(10)中沒(méi)有退出。主線程執(zhí)行結(jié)果已經(jīng)是sum=10,再過(guò)5秒后add_task線程才結(jié)束。

但是,線程是不能從外面主動(dòng)殺死的,只能讓它自己退出。

2、方法二 event.wait

應(yīng)用threading模塊里面的Event

用法和sleep差不多:

import threading
 
event = threading.Event()
event.wait(5)

上述例子可以這樣實(shí)現(xiàn):

import time
from threading import Thread
from threading import Event
 
 
class AddTask(Thread):
 
    def __init__(self):
        super().__init__()
        self.sum_num = 0
        self.event = Event()
 
    def run(self):
        print('Begin to add ...')
        while not self.event.is_set():
            print('Sleep start...')
            self.event.wait(10)
            print('Sleep end...')
            self.sum_num += 10
        print(f"Finish add, sum:{self.sum_num}...")
 
    def stop(self):
        print('Stop task...')
        self.event.set()
 
 
def do_main_task():
    print('Do main task...')
    time.sleep(15)
    print('Finish main task...')
    return True
 
 
if __name__ == '__main__':
    add_task = AddTask()
    add_task.start()
    main_task_end = do_main_task()
    if main_task_end:
        add_task.stop()
        time.sleep(1)
        print(f"sum: {add_task.sum_num}")

執(zhí)行結(jié)果:

Do main task...
Begin to add ...
Sleep start...
Sleep end...
Sleep start...
Finish main task...
Stop task...
Sleep end...
Finish add, sum:20...

sum: 20

當(dāng)執(zhí)行event.set()后,子線程里面self.event.is_set()就會(huì)返回 False,于是這個(gè)循環(huán)就不會(huì)繼續(xù)執(zhí)行了。

即使self.event.wait(10)剛剛開(kāi)始阻塞,只要我在主線程中執(zhí)行了event.set(),子線程里面的阻塞立刻就會(huì)結(jié)束。

于是子線程立刻就會(huì)結(jié)束。不需要再白白等待10秒。

并且,event.wait()這個(gè)函數(shù)在底層是使用 C 語(yǔ)言實(shí)現(xiàn)的,不受 GIL 鎖的干擾。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于python的list相關(guān)知識(shí)(推薦)

    關(guān)于python的list相關(guān)知識(shí)(推薦)

    下面小編就為大家?guī)?lái)一篇關(guān)于python的list相關(guān)知識(shí)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • python簡(jiǎn)單商城購(gòu)物車實(shí)例代碼

    python簡(jiǎn)單商城購(gòu)物車實(shí)例代碼

    這篇文章主要為大家詳細(xì)介紹了python簡(jiǎn)單商城購(gòu)物車的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Python爬蟲實(shí)現(xiàn)百度翻譯功能過(guò)程詳解

    Python爬蟲實(shí)現(xiàn)百度翻譯功能過(guò)程詳解

    這篇文章主要介紹了Python爬蟲實(shí)現(xiàn)百度翻譯功能過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python numpy二維數(shù)組如何刪除指定行和列

    Python numpy二維數(shù)組如何刪除指定行和列

    本文展示了如何對(duì)數(shù)組進(jìn)行行列刪除操作,包括刪除單行、單列、多行和多列的方法,通過(guò)具體的運(yùn)行結(jié)果展示,讀者可以清晰地了解到如何在不同情況下進(jìn)行數(shù)據(jù)處理,文章內(nèi)容實(shí)用,適合需要進(jìn)行數(shù)據(jù)處理的讀者參考學(xué)習(xí)
    2024-09-09
  • 給Python初學(xué)者的一些編程技巧

    給Python初學(xué)者的一些編程技巧

    這篇文章主要介紹了給Python初學(xué)者的一些編程技巧,皆是基于基礎(chǔ)的一些編程習(xí)慣建議,需要的朋友可以參考下
    2015-04-04
  • Python中代碼執(zhí)行失敗原因分析與解決

    Python中代碼執(zhí)行失敗原因分析與解決

    本文將深入探討Python代碼執(zhí)行失敗的原因、常見(jiàn)的錯(cuò)誤類型、診斷方法以及解決方案,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • python處理excel繪制雷達(dá)圖

    python處理excel繪制雷達(dá)圖

    這篇文章主要為大家介紹了python處理excel繪制雷達(dá)圖的相關(guān)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 解決python?pip安裝第三方模塊報(bào)錯(cuò):error:legacy-install-failure

    解決python?pip安裝第三方模塊報(bào)錯(cuò):error:legacy-install-failure

    pip是python的第三方庫(kù)管理器,可以根據(jù)所開(kāi)發(fā)項(xiàng)目的需要,使用pip相關(guān)命令安裝不同庫(kù),下面這篇文章主要給大家介紹了關(guān)于解決python?pip安裝第三方模塊報(bào)錯(cuò):error:?legacy?-?install?-?failure的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • python之PyMongo使用總結(jié)

    python之PyMongo使用總結(jié)

    本篇文章主要介紹了python之PyMongo使用總結(jié),詳細(xì)的介紹了PyMongo模塊的使用,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-05-05
  • Python基于locals返回作用域字典

    Python基于locals返回作用域字典

    這篇文章主要介紹了Python基于locals返回作用域字典,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論

讷河市| 从江县| 彰武县| 湄潭县| 南京市| 建阳市| 侯马市| 桑植县| 襄樊市| 丰镇市| 江川县| 辽中县| 和平区| 都江堰市| 始兴县| 历史| 武山县| 璧山县| 玉环县| 岳池县| 湛江市| 随州市| 伊金霍洛旗| 简阳市| 延安市| 曲阜市| 新河县| 元氏县| 兴山县| 固镇县| 渭南市| 盘锦市| 尤溪县| 尉氏县| 浦东新区| 铜梁县| 台南县| 大埔区| 清流县| 巨野县| 烟台市|