如何使用无限循环的目标函数创建一个可停止的线程

时间:2016-11-02 15:17:04

标签: python python-multithreading

假设我想在一个线程中运行一个名为run_forever()的函数,但仍然可以通过按 Ctrl + C 使其“停止”。我已经看到了使用StoppableThread的{​​{1}}子类执行此操作的方法,但这些似乎涉及将目标函数“复制”到该子类中。我想保持功能“它在哪里”。

考虑以下示例:

threading.Thread

目标函数import time import threading def run_forever(): # An externally defined function which runs indefinitely while True: print("Hello, world!") time.sleep(1) class StoppableThread(threading.Thread): """Thread class with a stop() method. The thread itself has to check regularly for the stopped() condition.""" def __init__(self, *args, **kwargs): super(StoppableThread, self).__init__(*args, **kwargs) self._stop = threading.Event() def stop(self): self._stop.set() def stopped(self): return self._stop.isSet() def run(self): while not self.stopped(): run_forever() # This doesn't work # print("Hello, world!") # This does self._stop.wait(1) thread = StoppableThread() thread.start() time.sleep(5) thread.stop() 本身就是一个永不退出的while循环。但是,为了获得所需的行为,run_forever命令必须在while循环中,正如我所理解的那样。

有没有办法在不修改wait()功能的情况下实现所需的行为?

1 个答案:

答案 0 :(得分:3)

我怀疑它是否可能 顺便说一句,你有没有尝试过第二个解决方案 您之前链接的the post ThreadWithExc来的?{。} 它适用于循环繁忙的纯Python(例如,没有sleep),否则我切换到multiprocessing并终止子进程。以下是希望优雅退出的代码(仅限* nix):

from multiprocessing import Process
from signal import signal, SIGTERM
import time

def on_sigterm(*va):
    raise SystemExit

def fun():
    signal(SIGTERM, on_sigterm)
    try:
        for i in xrange(5):
            print 'tick', i
            time.sleep(1)
    finally:
        print 'graceful cleanup'

if __name__=='__main__':
    proc = Process(target=fun)
    proc.start()
    time.sleep(2.5)
    proc.terminate()
    proc.join()