您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“python中暫停代碼的方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“python中暫停代碼的方法是什么”吧!
我們知道,在 Python 里面可以使用time.sleep來讓代碼暫停一段時間,例如:
import time print('...部分代碼...') time.sleep(5) print('...剩下的代碼...')
程序首先打印出...部分代碼...,然后等待5秒鐘,再打印出...剩下的代碼...。
現(xiàn)在大家想一想,有沒有什么辦法,在不使用time.sleep的情況下,讓程序暫停5秒?
你可能會說,用requests訪問一個延遲5秒的網(wǎng)址、或者用遞歸版算法計算斐波那契數(shù)列第36位……這些奇技淫巧。
不過今天我說的,是另外一個東西,threading模塊里面的Event。
我們來看看它的用法:
import threading event = threading.Event() print('...部分代碼...') event.wait(5) print('...剩下的代碼...')
這樣一來,程序首先打印出...部分代碼...,然后等待5秒鐘,再打印出...剩下的代碼...。
功能看起來跟time.sleep沒什么區(qū)別,那為什么我要特別提到它呢?因?yàn)樵诙嗑€程里面,它比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 是否有數(shù)據(jù)') time.sleep(60) trigger_async_task() event = threading.Event() checker = Checker(event) checker.start() if user_cancel_task(): event.set()
我來解釋一下這段代碼的意思。在主線程里面,我調(diào)用trigger_async_task()觸發(fā)了一個異步任務(wù)。這個任務(wù)多久完成我并不清楚。但是這個任務(wù)完成以后,它會往 Redis 里面發(fā)送一條消息,只要 Redis 有這個消息了,我就知道它完成了。所以我要創(chuàng)建一個 checker 子線程,每60秒去 Redis里面檢查任務(wù)是否完成。如果沒有完成,就暫停60秒,然后再檢查。
但某些情況下,我不需要等待了,例如用戶主動取消了任務(wù)。這個時候,我就想提前結(jié)束這個 checker 子線程。
但是我們知道,線程是不能從外面主動殺死的,只能讓它自己退出。所以當(dāng)我執(zhí)行event.set()后,子線程里面self.event.is_set()就會返回 False,于是這個循環(huán)就不會繼續(xù)執(zhí)行了。
可是,如果某一輪循環(huán)剛剛開始,我在主線程里面調(diào)用了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 是否有數(shù)據(jù)') self.event.wait(60) trigger_task() event = threading.Event() checker = Checker(event) checker.start() if user_cancel_task(): event.set()
那么,即便self.event.wait(60)剛剛開始阻塞,只要我在主線程中執(zhí)行了event.set(),子線程里面的阻塞立刻就會結(jié)束。于是子線程立刻就會結(jié)束。不需要再白白等待60秒。
并且,event.wait()這個函數(shù)在底層是使用 C 語言實(shí)現(xiàn)的,不受 GIL 鎖的干擾。
到此,相信大家對“python中暫停代碼的方法是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。