Python多線程中比time.sleep更好用的暫停方式
Python多線程比time.sleep更好用的暫停
在python代碼中,如果需要程序暫停一段時間,通常情況下使用的是time.sleep()方法。
示例代碼:
import time
print('...部分代碼...')
time.sleep(3)
print('...剩下的代碼...')運行結(jié)果:

在多線程中,還有另外一種方法,threading模塊中的Event。
示例代碼:
import threading
event = threading.Event()
print('...部分代碼...')
event.wait(3)
print('...剩下的代碼...')運行結(jié)果:

使用event()方法,首先先打印,然后等待3秒,再繼續(xù)執(zhí)行后面的程序。
以上看起來和time.sleep()方法類似
接下來看一些例子來展示event()的好處
示例代碼:
import threading
import time
class Checker(threading.Thread):
def __init__(self, event):
super().__init__()
self.event = event
def run(self) -> None:
while not self.event.is_set():
print("進行檢查某個任務(wù)狀態(tài)!")
time.sleep(50)
# 某個異步任務(wù)
# async_task()
event = threading.Event()
checker = Checker(event)
checker.start()
# 異步任務(wù)檢查
# if user_cancel_task():
# event.set()運行結(jié)果:

但是在某種情況下,如果主動取消任務(wù),就不需要等待,這個時候就需要結(jié)束Checker這個子線程了。
線程是不能從外面主動殺死的,只能讓它自己退出。當執(zhí)行event.set()后,子線程里面self.event.is_set()就會返回 False,于是這個循環(huán)就不會繼續(xù)執(zhí)行了。
可是,如果某一輪循環(huán)剛剛開始,我在主線程里面調(diào)用了event.set()。此時,子線程還在time.sleep中,那么子線程需要等待50秒才會退出。這是就可以體現(xiàn)出event()的好處了。使用self.event.wait(60)。
示例代碼:
import threading
class Checker(threading.Thread):
def __init__(self, event):
super().__init__()
self.event = event
def run(self) -> None:
while not self.event.is_set():
print("進行檢查某個任務(wù)狀態(tài)!")
self.event.wait(50)
# 某個異步任務(wù)
# async_task()
event = threading.Event()
checker = Checker(event)
checker.start()
# 異步任務(wù)檢查
# if user_cancel_task():
# event.set()運行結(jié)果:

即便self.event.wait(50)剛剛開始阻塞,只要我在主線程中執(zhí)行了event.set(),子線程里面的阻塞立刻就會結(jié)束。
于是子線程立刻就會結(jié)束。不需要再白白等待50秒。
并且,event.wait()這個函數(shù)在底層是使用 C 語言實現(xiàn)的,不受 GIL 鎖的干擾。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
pyodps中的apply用法及groupby取分組排序第一條數(shù)據(jù)
這篇文章主要介紹了pyodps中的apply用法及groupby取分組排序第一條數(shù)據(jù),問綻放圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值需要的小伙伴可以參考一下2022-05-05
Python實現(xiàn)接口自動化封裝導(dǎo)出excel和讀寫excel數(shù)據(jù)
這篇文章主要為大家詳細介紹了Python如何實現(xiàn)接口自動化封裝導(dǎo)出excel和讀寫excel數(shù)據(jù),文中的示例代碼簡潔易懂,希望對大家有所幫助2023-07-07
python-Web-flask-視圖內(nèi)容和模板知識點西寧街
在本篇文章里小編給大家分享了關(guān)于python-Web-flask-視圖內(nèi)容和模板的相關(guān)知識點內(nèi)容,有需要的朋友們參考學習下。2019-08-08
Python實現(xiàn)將mp3音頻格式轉(zhuǎn)換為wav格式
這篇文章主要介紹了利用python寫了這個小工具,可以批量進行mp3音頻格式轉(zhuǎn)換為wav格式,文中的示例代碼講解詳細,感興趣的可以學習一下2022-01-01
Pandas中字符串和時間轉(zhuǎn)換與格式化的實現(xiàn)
本文主要介紹了Pandas中字符串和時間轉(zhuǎn)換與格式化的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01
Python3如何使用tabulate打印數(shù)據(jù)
這篇文章主要介紹了Python3如何使用tabulate打印數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09
python神經(jīng)網(wǎng)絡(luò)Keras?GhostNet模型的實現(xiàn)
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)Keras?GhostNet模型的復(fù)現(xiàn)詳解,2022-05-05

