python多線程——如何停止一個死循環的線程


進程想要執行任務就需要依賴線程。換句話說,就是進程中的最小執行單位就是線程,並且一個進程中至少有一個線程。

那什么是多線程?提到多線程這里要說兩個概念,就是串行和並行,搞清楚這個,我們才能更好地理解多線程。

所謂串行,其實是相對於單條線程來執行多個任務來說的,我們就拿下載文件來舉個例子:當我們下載多個文件時,在串行中它是按照一定的順序去進行下載的,也就是說,必須等下載完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, threadID, name, 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, threadID, name, 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, "Thread-1", 1)
    thread1.start()
    while thread1.counter:
        time.sleep(1)
        print("死循環")
    thread1.join()


if __name__ == '__main__':
    Dead_circle()
復制代碼

 

整體思路

原來的思路是執行線程,然后規定條件,當條件觸發時,直接停止該線程,但是由於線程守護的原因,我們沒辦法使得一個死循環突然停止,因此,我修改了原來的思路,我讓死循環函數在定義的時候去創建一個計時線程,這樣我的線程就是可控的,通過查找線程中的變量,獲得是否停止,這樣就可以控制我的線程執行時間。

 

轉:https://www.cnblogs.com/xiaobaidaka/p/14029621.html


免責聲明!

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



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