2013-10-23 135 views
0

我定義了類A的方法,它有一個像這樣的方法。在Python中殺死線程

def func(self): 
    while True: 
     threading.Timer(0,self.func2, ["0"]).start() 
     time.sleep(nseconds) 
     threading.Timer(0,self.func2, ["1"]).start() 
     time.sleep(nseconds) 

如果我在另一個腳本定義這個類的一個實例並運行該實例的func方法,我怎麼可以打破while循環,正確停止這些線程?我是否需要A類中的ctrl-c信號處理程序,如果是,如何?注意:我也在呼叫os.system函數的func2函數的一個系統調用。問題是當我運行主腳本文件並嘗試停止運行這些線程時,它們不停止。

+0

看這裏例如在線程通信http://eli.thegreenplace.net/2011/12/27/python-threads-communication-and-stopping/ – alko

回答

3

將使用Events

from threading import Event 

class Foo(object): 

    def __init__(self): 
     # the stop event is initially set to false, use .set() to set it true 
     self.stop_event = Event() 

    def func(self): 
     while not self.stop_event.is_set(): 
      # your code 

與此同時,在其他線程(假設your're談論的是obj的對象)有很多方法來實現你想要什麼,最直接者之一無數:

obj.stop_event.set() 

完成循環的下一次迭代。

+0

它的工作原理,但仍有一點問題。當我在調用obj.func的主腳本中按ctrl-c時,第一個信號轉到線程而不是主腳本的信號處理程序。因此,我不得不按兩次ctrl-c我該如何處理? –

+1

是的,這有點棘手,但仍然很簡單:你必須在主線程的處理程序中捕獲信號(SIGINT左右),並且在出現該信號時(即按下ctrl-c)調用處理函數。從那個處理程序中你可以完成殺死其他線程所需的一切。請參閱[Signal](http://docs.python.org/2/library/signal.html)或Google for python信號線程,您會發現一些示例代碼。 –