我有一个非常简单的多线程python代码,有两个线程试图从队列中弹出和打印。我使用锁来确保相互排斥。一切正常,除了:
50
,程序将从终端Queue
退出KeyboardInterrup
(内部实现为class Queue(object)
),则线程会在list
之后继续打印到终端。以下是我的代码:https://ideone.com/ArTcwE(虽然您无法在ideone上测试KeyboardInterrupt
)
PS:我已经通过Close multi threaded application with KeyboardInterrupt了。它并没有解决我的问题。
更新1 :我理解(感谢@SuperSaiyan的回答)为什么线程会继续在方案#2中运行 - 主函数在KeyboardInterrupt
之前就已经死了设为job_done
。因此,线程一直等待信号到达。但奇怪的是,即使在情景#1中,True
仍然是job_done
。线程以某种方式被杀死:
False
更新2 :在此处粘贴代码以获得永久性:
>>> execfile('threaded_queue.py')
Starting Q1Starting Q2
Q1 got 0
Q2 got 1
Q1 got 2
Q1 got 3
Traceback (most recent call last):
File "<pyshell#68>", line 1, in <module>
execfile('threaded_queue.py')
File "threaded_queue.py", line 54, in <module>
while not q.empty():
KeyboardInterrupt
>>> job_done
False
>>>
答案 0 :(得分:2)
您的问题不是您的自定义Queue
v / s python&#39; s Queue
。这完全是另一回事。此外,即使使用python的Queue
实现,您也会看到相同的行为。
这是因为你的主线程在你按ctrl+C
之后才能发出信号,然后才能发出其他两个线程退出(使用job_done = True
)。
您需要的是一种告诉其他两个线程退出的机制。下面是一个简单的机制 - 您可能需要更强大的功能,但您可以得到这个想法:
try:
while not job_done:
time.sleep(0.1) #Trying using this instead of CPU intensive `pass`.
except KeyboardInterrupt as e:
job_done = True