2012-08-07 145 views
0

有沒有辦法用Python殺死一個特定的線程?我有一個線程運行一個循環的函數,它干擾了程序的其他部分。當某個功能開始時,我需要殺死它,有沒有辦法做到這一點?殺死一個特定的線程Python

+1

如果您必須殺死一個線程才能讓程序正常工作,那麼您正在執行一些非常錯誤的操作*。 – 2012-08-07 21:40:17

+0

定期循環檢查一些布爾變量,讓它成爲'proceed'。在主線程中,當另一個線程停止時,設置「proceed = False」;它會在下一次迭代時停止。 – 9000 2012-08-07 21:43:18

+0

你能更詳細地描述這個問題嗎?也許有更好的解決方案。我的意思是肯定有比殺死線程更好的解決方案。但是,也許你可以使用threading.Lock()對象來解決你的問題 – 2012-08-07 21:59:51

回答

2

要做到這一點,最好的方法是使用線程定期檢查的退出標誌,並在設置後退出。當你需要殺死線程時,你可以設置這個標誌並等待線程自行退出。

This answer有關於爲什麼強行殺死線程的其他信息是一個壞主意,以及上述方法的Python實現。

0

我發現如果您定義了一個帶有self.flag變量的Threading類,並且讓該函數調用該類的函數,則可以在特定於線程的實例上設置該標誌並使用if語句退出特定的線程。

不難想象這更加動態,並且允許產生和關閉線程。

class AutoPilotThreader(threading.Thread): 
    def __init__(self, threadID, name): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 
     self.name = name 
     self.flag = 0 
    def run(self): 
     print "Starting " + self.name 
     self.SelTestRun() 
     print "Exiting " + self.name 

    def SelTestRun(self): 
     # do code 
     while 1: 
      if self.flag: 
       return 
      else: 
       time.sleep(1) 


my_threads = [] 
t1 = AutoPilotThreader(1, "t1") 
t2 = AutoPilotThreader(2, "t2") 
t1.start() 
t2.start() 
my_threads.append(t1) 
my_threads.append(t2) 


while 1: 
    print("What would you like to do: 1. Quit 2. Start New 3. Check") 
    choice = input("Enter : ") 
    if choice == 1: 
     choice = input(" 1 or 2 or 3 ") 
     if choice == 1: 
      t1.flag = 1 
     elif choice ==2: 
      t2.flag = 1 
     elif choice ==3: 
      t3.flag = 1 .........