相关疑难解决方法(0)

python:如何在主程序结束时终止一个线程

如果我有一个无限循环的线程,有没有办法在主程序结束时终止它(例如,当我按Ctrl+ C)?

python multithreading python-multithreading

74
推荐指数
6
解决办法
14万
查看次数

python 2.6.x theading/signals/atexit在某些版本上失败了吗?

我已经看到了很多与此相关的问题...但我的代码适用于python 2.6.2并且无法在python 2.6.5上运行.我错误地认为整个atexit"通过这个模块注册的功能在程序被信号杀死时不被调用"这件事不应该在这里计算,因为我正在捕捉信号然后干净地退出?这里发生了什么?什么是正确的方法来做到这一点?

import atexit, sys, signal, time, threading

terminate = False
threads = []

def test_loop():
    while True:
        if terminate:
            print('stopping thread')
            break
        else:
            print('looping')
            time.sleep(1)

@atexit.register
def shutdown():
    global terminate
    print('shutdown detected')
    terminate = True
    for thread in threads:
        thread.join()

def close_handler(signum, frame):
    print('caught signal')
    sys.exit(0)

def run():
    global threads
    thread = threading.Thread(target=test_loop)
    thread.start()
    threads.append(thread)

    while True:
        time.sleep(2)
        print('main')

signal.signal(signal.SIGINT, close_handler)

if __name__ == "__main__":
    run()
Run Code Online (Sandbox Code Playgroud)

python 2.6.2:

$ python halp.py 
looping
looping
looping …
Run Code Online (Sandbox Code Playgroud)

python multithreading signals atexit

5
推荐指数
1
解决办法
2566
查看次数