python - 终止无限循环的线程应用程序

标签 python signals

考虑一个假设的线程 Python 应用程序,它在无限循环中运行每个线程:

import signal                                                          
import sys 
import threading
import time

class CallSomebody (threading.Thread):
        def __init__(self, target, *args):
                self._target = target
                self._args = args
                threading.Thread.__init__(self)

        def run (self):
                self._target(*self._args)

def call (who):
        while True:
                print "Who you gonna call? %s" % (str(who))



def signal_handler(signal, frame):
    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)



a=CallSomebody(call, 'Ghostbusters!')
a.daemon=True

b=CallSomebody(call, 'The Exorcist!')
b.daemon=True

a.start()
b.start()

a.join()
b.join()

运行应用程序时,通过按 CtrlC 发送 SIGINT 不会停止应用程序。我尝试删除 daemon 语句,但这没有帮助。我缺少什么基本想法?

谢谢。

最佳答案

当您加入一个线程时,事件线程会阻塞,直到加入的线程返回。你的永远不会。你不会想以这种方式加入他们。

通常,作为守护线程且执行无限循环的后台线程应标记为守护线程,从不加入,然后在主线程这样做时允许其过期。例如,如果您碰巧使用 wx,则在启动守护线程后,您将调用 AppInstance.MainLoop(),然后当您的 Frame 或其他任何顶部您拥有的级别实例已关闭,程序执行将结束,并且守护进程将得到适当处理。

关于python - 终止无限循环的线程应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13556841/

相关文章:

c - 守护进程不会注册 sigint 信号

c - 将由信号更改的变量发送到子进程中由 exec 创建的进程。[C]

python - 将列表的 koalas 列拆分为多列

python - 同时从 Rabbitmq 接收日志并运行您的 flask 应用程序

python - 删除字符串中重复的换行符

c++ - 如何在 C++ 中使用 std::bind 函数作为信号处理程序?

c - 了解 SIGUSR1 是否已发送到进程的最佳方法

c - C中的信号处理——中断中的中断

python - TIC TAC TOE 仅接受整数

python - 我删除了 anaconda,现在我的 python 路径搞砸了。你知道怎么修吗?