2013-10-23 56 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信号线程,您会发现一些示例代码。 –