在Python中杀死线程
我定义了类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
函数的一个系统调用。问题是当我运行主脚本文件并尝试停止运行这些线程时,它们不停止。
将使用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()
完成循环的下一次迭代。
它的工作原理,但仍有一点问题。当我在调用obj.func的主脚本中按ctrl-c时,第一个信号转到线程而不是主脚本的信号处理程序。因此,我不得不按两次ctrl-c我该如何处理? –
是的,这有点棘手,但仍然很简单:你必须在主线程的处理程序中捕获信号(SIGINT左右),并且在出现该信号时(即按下ctrl-c)调用处理函数。从那个处理程序中你可以完成杀死其他线程所需的一切。请参阅[Signal](http://docs.python.org/2/library/signal.html)或Google for python信号线程,您会发现一些示例代码。 –
看这里例如在线程通信http://eli.thegreenplace.net/2011/12/27/python-threads-communication-and-stopping/ – alko