python 如何停止一個(gè)死循環(huán)的線程
進(jìn)程想要執(zhí)行任務(wù)就需要依賴線程。換句話說(shuō),就是進(jìn)程中的最小執(zhí)行單位就是線程,并且一個(gè)進(jìn)程中至少有一個(gè)線程。
那什么是多線程?提到多線程這里要說(shuō)兩個(gè)概念,就是串行和并行,搞清楚這個(gè),我們才能更好地理解多線程。
所謂串行,其實(shí)是相對(duì)于單條線程來(lái)執(zhí)行多個(gè)任務(wù)來(lái)說(shuō)的,我們就拿下載文件來(lái)舉個(gè)例子:當(dāng)我們下載多個(gè)文件時(shí),在串行中它是按照一定的順序去進(jìn)行下載的,也就是說(shuō),必須等下載完A之后才能開(kāi)始下載B,它們?cè)跁r(shí)間上是不可能發(fā)生重疊的。

并行:下載多個(gè)文件,開(kāi)啟多條線程,多個(gè)文件同時(shí)進(jìn)行下載,這里是嚴(yán)格意義上的,在同一時(shí)刻發(fā)生的,并行在時(shí)間上是重疊的。

問(wèn)題描述:
前幾天寫(xiě)一個(gè)項(xiàng)目,然后項(xiàng)目中有一個(gè)死循環(huán)的線程,我需要讓他在我需要的時(shí)候直接停止該線程,但是使用基本方法join(),效果是無(wú)效的,因此我又去了百度方法,外加國(guó)外官方文檔,大概的結(jié)果就是為了保護(hù)進(jìn)程,這種死循環(huán)使用原來(lái)方法是很難實(shí)現(xiàn)的,
整體解決方案:
創(chuàng)建線程函數(shù)
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("開(kāi)啟線程: " + self.name)
# 獲取鎖,用于線程同步
threadLock.acquire()
# 執(zhí)行要開(kāi)啟的線程
# 釋放鎖,開(kāi)啟下一個(gè)線程
threadLock.release()
死循環(huán)函數(shù)
def Dead_circle():
while True:
print("死循環(huán)")
增加結(jié)束的條件
def run_go():
num = 0
while True:
time.sleep(1)
num += 1
if num == 10:
return False # 假設(shè)我執(zhí)行10s后結(jié)束
增加新方法
def run_go():
num = 0
while True:
time.sleep(1)
num += 1
if num == 10:
return False
修改執(zhí)行方法
def Dead_circle():
thread1 = myThread(1, "Thread-1", 1)
thread1.start()
while thread1.counter:
time.sleep(1)
print("死循環(huán)")
thread1.join()
修改線程類
class myThread(threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
self.State = True
def run(self):
print("開(kāi)啟線程: " + self.name)
# 獲取鎖,用于線程同步
threadLock.acquire()
# 執(zhí)行要開(kāi)啟的線程
if not run_go():
self.counter = False
# 釋放鎖,開(kāi)啟下一個(gè)線程
threadLock.release()
整體代碼
import threading
import time
from tkinter import *
threadLock = threading.Lock()
class myThread(threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
self.State = True
def run(self):
print("開(kāi)啟線程: " + self.name)
# 獲取鎖,用于線程同步
threadLock.acquire()
# 執(zhí)行要開(kāi)啟的線程
if not run_go():
self.counter = False
# 釋放鎖,開(kāi)啟下一個(gè)線程
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, "Thread-1", 1)
thread1.start()
while thread1.counter:
time.sleep(1)
print("死循環(huán)")
thread1.join()
if __name__ == '__main__':
Dead_circle()
整體思路
原來(lái)的思路是執(zhí)行線程,然后規(guī)定條件,當(dāng)條件觸發(fā)時(shí),直接停止該線程,但是由于線程守護(hù)的原因,我們沒(méi)辦法使得一個(gè)死循環(huán)突然停止,因此,我修改了原來(lái)的思路,我讓死循環(huán)函數(shù)在定義的時(shí)候去創(chuàng)建一個(gè)計(jì)時(shí)線程,這樣我的線程就是可控的,通過(guò)查找線程中的變量,獲得是否停止,這樣就可以控制我的線程執(zhí)行時(shí)間。
以上就是python 如何停止一個(gè)死循環(huán)的線程的詳細(xì)內(nèi)容,更多關(guān)于python 停止死循環(huán)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python3兩數(shù)相加的實(shí)現(xiàn)示例
這篇文章主要介紹了python3兩數(shù)相加的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
PyTorch基礎(chǔ)之torch.nn.Conv2d中自定義權(quán)重問(wèn)題
這篇文章主要介紹了PyTorch基礎(chǔ)之torch.nn.Conv2d中自定義權(quán)重問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Python實(shí)現(xiàn)批量讀取HDF多波段柵格數(shù)據(jù)并繪制像元直方圖
這篇文章主要為大家詳細(xì)介紹了如何基于Python語(yǔ)言gdal模塊,實(shí)現(xiàn)多波段HDF柵格圖像文件的讀取、處理與像元值可視化(直方圖繪制)等操作,需要的可以參考一下2023-03-03

