Python 除了 time.sleep,你還有一個暫停代碼的方法


我們知道,在 Python 里面可以使用time.sleep來讓代碼暫停一段時間,例如:

import time

print('...部分代碼...')
time.sleep(5)
print('...剩下的代碼...')

程序首先打印出...部分代碼...,然后等待5秒鍾,再打印出...剩下的代碼...。

現在大家想一想,有沒有什么辦法,在不使用time.sleep的情況下,讓程序暫停5秒?

你可能會說,用requests訪問一個延遲5秒的網址、或者用遞歸版算法計算斐波那契數列第36位……這些奇技淫巧。

不過今天我說的,是另外一個東西,threading模塊里面的Event。

我們來看看它的用法:

import threading

event = threading.Event()
print('...部分代碼...')
event.wait(5)
print('...剩下的代碼...')

這樣一來,程序首先打印出...部分代碼...,然后等待5秒鍾,再打印出...剩下的代碼...。

功能看起來跟time.sleep沒什么區別,那為什么我要特別提到它呢?因為在多線程里面,它比time.sleep更有用。我們來看一個例子:

import threading

class Checker(threading.Thread):
    def __init__(self, event):
        super().__init__()
        self.event = event

    def run(self):
        while not self.event.is_set():
            print('檢查 redis 是否有數據')
            time.sleep(60)

trigger_async_task()
event = threading.Event()
checker = Checker(event)
checker.start()
if user_cancel_task():
    event.set()

我來解釋一下這段代碼的意思。在主線程里面,我調用trigger_async_task()觸發了一個異步任務。這個任務多久完成我並不清楚。但是這個任務完成以后,它會往 Redis 里面發送一條消息,只要 Redis 有這個消息了,我就知道它完成了。所以我要創建一個 checker 子線程,每60秒去 Redis里面檢查任務是否完成。如果沒有完成,就暫停60秒,然后再檢查。

但某些情況下,我不需要等待了,例如用戶主動取消了任務。這個時候,我就想提前結束這個 checker 子線程。

但是我們知道,線程是不能從外面主動殺死的,只能讓它自己退出。所以當我執行event.set()后,子線程里面self.event.is_set()就會返回 False,於是這個循環就不會繼續執行了。

可是,如果某一輪循環剛剛開始,我在主線程里面調用了event.set()。此時,子線程還在time.sleep中,那么子線程需要等待60秒才會退出。

但如果我修改一下代碼,使用self.event.wait(60):

import threading

class Checker(threading.Thread):
    def __init__(self, event):
        super().__init__()
        self.event = event

    def run(self):
        while not self.event.is_set():
            print('檢查 redis 是否有數據')
            self.event.wait(60)

trigger_task()
event = threading.Event()
checker = Checker(event)
checker.start()
if user_cancel_task():
    event.set()

那么,即便self.event.wait(60)剛剛開始阻塞,只要我在主線程中執行了event.set(),子線程里面的阻塞立刻就會結束。於是子線程立刻就會結束。不需要再白白等待60秒。

並且,event.wait()這個函數在底層是使用 C 語言實現的,不受 GIL 鎖的干擾。

注意:如果你是打算找python高薪工作的話。我建議你多寫點真實的企業項目積累經驗。不然工作都找不到,當然很多人沒進過企業,怎么會存在項目經驗呢? 所以你得多找找企業項目實戰多練習下撒。如果你很懶不想找,也可以進我的Python交流圈:1156465813。群文件里面有我之前在做開發寫過的一些真實企業項目案例。你可以拿去學習,不懂都可以在裙里找我,有空會耐心給你解答下。

 

以下內容無用,為本篇博客被搜索引擎抓取使用
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
python 是干什么的 零基礎學 python 要多久 python 為什么叫爬蟲
python 爬蟲菜鳥教程 python 爬蟲萬能代碼 python 爬蟲怎么掙錢
python 基礎教程 網絡爬蟲 python python 爬蟲經典例子
python 爬蟲
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
以上內容無用,為本篇博客被搜索引擎抓取使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM