Python如何用信号杀死阻塞在队列上的线程?

标签 python multithreading queue

我在一个队列上启动了一堆线程,我想在发送 SIGINT (Ctrl+C) 时杀死它们。处理此问题的最佳方法是什么?

targets = Queue.Queue()
threads_num = 10
threads = []

for i in threads_num:
    t = MyThread()
    t.setDaemon(True)
    threads.append(t)
    t.start()

targets.join()

最佳答案

如果您对让其他线程正常关闭不感兴趣,只需以守​​护进程模式启动它们并将队列的加入包装在终止线程中即可。

这样,您就可以使用线程的 join 方法——它支持超时并且不会阻止异常——而不必等待队列的 join 方法。

换句话说,做这样的事情:

term = Thread(target=someQueueVar.join)
term.daemon = True
term.start()
while (term.isAlive()):
    term.join(3600)

现在,Ctrl+C 将终止 MainThread,随后 Python 解释器会硬杀死所有标记为“守护进程”的线程。请注意,这意味着您必须为所有其他线程设置“Thread.daemon”,或者通过捕获正确的异常(KeyboardInterrupt 或 SystemExit)并为它们退出做任何需要做的事情来优雅地关闭它们。

另请注意,您绝对需要将一个数字传递给term.join(),否则它也会忽略所有异常。不过,您可以选择任意高的数字。

关于Python如何用信号杀死阻塞在队列上的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7610545/

相关文章:

python - 简单数据集 regplot 中的 keyerror - AttributeError : 'str' object has no attribute 'conjugate'

c# - C# 中的跨进程锁定

java - 阻塞队列设计

c++ - 队列的指针问题

c++ - 排队对象的分配策略

python - 在 Pandas 中将元组设置为列名

python - 如果用户有多个电子邮件地址,我是否需要存储多个 oauth token ?

Java:多线程邮件应用程序泄漏内存

c++ - 多线程说明

python - 带索引的 pyOpenGL VBO