python 如何停止一個死迴圈的執行緒
阿新 • • 發佈:2020-11-25
程序想要執行任務就需要依賴執行緒。換句話說,就是程序中的最小執行單位就是執行緒,並且一個程序中至少有一個執行緒。
那什麼是多執行緒?提到多執行緒這裡要說兩個概念,就是序列和並行,搞清楚這個,我們才能更好地理解多執行緒。
所謂序列,其實是相對於單條執行緒來執行多個任務來說的,我們就拿下載檔案來舉個例子:當我們下載多個檔案時,在序列中它是按照一定的順序去進行下載的,也就是說,必須等下載完A之後才能開始下載B,它們在時間上是不可能發生重疊的。
並行:下載多個檔案,開啟多條執行緒,多個檔案同時進行下載,這裡是嚴格意義上的,在同一時刻發生的,並行在時間上是重疊的。
問題描述:
前幾天寫一個專案,然後專案中有一個死迴圈的執行緒,我需要讓他在我需要的時候直接停止該執行緒,但是使用基本方法join(),效果是無效的,因此我又去了百度方法,外加國外官方文件,大概的結果就是為了保護程序,這種死迴圈使用原來方法是很難實現的,
整體解決方案:
建立執行緒函式
class myThread(threading.Thread): def __init__(self,threadID,name,counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): print("開啟執行緒: " + self.name) # 獲取鎖,用於執行緒同步 threadLock.acquire() # 執行要開啟的執行緒 # 釋放鎖,開啟下一個執行緒 threadLock.release()
死迴圈函式
def Dead_circle(): while True: print("死迴圈")
增加結束的條件
def run_go(): num = 0 while True: time.sleep(1) num += 1 if num == 10: return False # 假設我執行10s後結束
增加新方法
def run_go(): num = 0 while True: time.sleep(1) num += 1 if num == 10: return False
修改執行方法
def Dead_circle(): thread1 = myThread(1,"Thread-1",1) thread1.start() while thread1.counter: time.sleep(1) print("死迴圈") thread1.join()
修改執行緒類
class myThread(threading.Thread): def __init__(self,counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter self.State = True def run(self): print("開啟執行緒: " + self.name) # 獲取鎖,用於執行緒同步 threadLock.acquire() # 執行要開啟的執行緒 if not run_go(): self.counter = False # 釋放鎖,開啟下一個執行緒 threadLock.release()
整體程式碼
import threading import time from tkinter import * threadLock = threading.Lock() class myThread(threading.Thread): def __init__(self,counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter self.State = True def run(self): print("開啟執行緒: " + self.name) # 獲取鎖,用於執行緒同步 threadLock.acquire() # 執行要開啟的執行緒 if not run_go(): self.counter = False # 釋放鎖,開啟下一個執行緒 threadLock.release() def run_go(): num = 0 while True: time.sleep(1) num += 1 if num == 10: return False def Dead_circle(): thread1 = myThread(1,1) thread1.start() while thread1.counter: time.sleep(1) print("死迴圈") thread1.join() if __name__ == '__main__': Dead_circle()
整體思路
原來的思路是執行執行緒,然後規定條件,當條件觸發時,直接停止該執行緒,但是由於執行緒守護的原因,我們沒辦法使得一個死迴圈突然停止,因此,我修改了原來的思路,我讓死迴圈函式在定義的時候去建立一個計時執行緒,這樣我的執行緒就是可控的,通過查詢執行緒中的變數,獲得是否停止,這樣就可以控制我的執行緒執行時間。
以上就是python 如何停止一個死迴圈的執行緒的詳細內容,更多關於python 停止死迴圈的資料請關注我們其它相關文章!