1. 程式人生 > 程式設計 >python 如何停止一個死迴圈的執行緒

python 如何停止一個死迴圈的執行緒

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

那什麼是多執行緒?提到多執行緒這裡要說兩個概念,就是序列和並行,搞清楚這個,我們才能更好地理解多執行緒。

所謂序列,其實是相對於單條執行緒來執行多個任務來說的,我們就拿下載檔案來舉個例子:當我們下載多個檔案時,在序列中它是按照一定的順序去進行下載的,也就是說,必須等下載完A之後才能開始下載B,它們在時間上是不可能發生重疊的。

python 如何停止一個死迴圈的執行緒

並行:下載多個檔案,開啟多條執行緒,多個檔案同時進行下載,這裡是嚴格意義上的,在同一時刻發生的,並行在時間上是重疊的。

python 如何停止一個死迴圈的執行緒

問題描述:

前幾天寫一個專案,然後專案中有一個死迴圈的執行緒,我需要讓他在我需要的時候直接停止該執行緒,但是使用基本方法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 停止死迴圈的資料請關注我們其它相關文章!