2017-03-01 57 views
0

我正試圖通過在另一個線程中運行的對象worker上調用stopThread來輕輕地終止正在運行的Python線程。無法調用在線程中運行的對象中的函數

但是這樣做是給我的錯誤:

AttributeError: 'Thread' object has no attribute 'stopThread' 

我們怎樣才能解決這個問題?

import threading 
import time 

class Worker(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.stopRequest = threading.Event() 

    def doSomething(self): 
     while True: 
      if not self.stopRequest.isSet(): 
       print 'Doing something' 
       time.sleep(5) 

    def stopThread(self): 
     self.stopRequest.set() 


def startWorker(): 
    worker = Worker() 
    worker.doSomething() 


# Start thread 
t = threading.Thread(target=startWorker) 
t.start() 

# Stop thread 
t.stopThread() 
+0

有幫助的線程終止討論:http://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python – DyZ

+0

你沒有創建你的'你可能認爲你是工作者的子類。請參閱[** _如何啓動和停止線程?_ **](http://stackoverflow.com/questions/15729498/how-to-start-and-stop-thread)示例。 – martineau

回答

0

你有錯誤:

AttributeError: 'Thread' object has no attribute 'stopThread' 
       ^^^^^^^^^^^^^^ 

因爲

t = threading.Thread(target=startWorker) 

..和並不像你打算一個Worker對象。

可以這樣說:t = Worker(target=startWorker)?當然,您必須將關鍵字參數作爲附加參數並將它們發送到您的超類Thread


或者,你有沒有想對你說:worker.stopThread()startWorker()代替t.stopThread()之外?

+0

我更新了問題中的代碼,以更好地反映我正在嘗試做的事情。我是新來的線程在Python中。基本上試圖創建一個對象'Worker',其所有的代碼將運行在不同的線程中,運行'doSomething'方法,然後終止線程。 – Nyxynyx

+0

我的代碼試圖讓'startWorker'函數在新線程中運行 – Nyxynyx

+0

我讀了你的代碼。你實際上混淆了各種各樣的東西。 1)「Worker」類應該像線程一樣行事嗎?還是應該是非線程的東西,並做一些工作?如果是後者,從'Thread'繼承'Worker'類是沒有意義的。如果是先前的話,你應該說:'t = Worker(..)'就像我答案的第一部分一樣。 2)你正在設置'threading.Event',但從不使用它。你應該有一個循環或者一些檢查這個對象的東西。這讓我覺得可能會打算讓Worker看起來像線程一樣。看看這個答案:http://stackoverflow.com/a/27261365/227884 – SuperSaiyan