即使在KeyboardInterrupt之后,多线程代码也会保持打印

时间:2016-06-22 06:24:57

标签: python multithreading

我有一个非常简单的多线程python代码,有两个线程试图从队列中弹出和打印。我使用锁来确保相互排斥。一切正常,除了:

  1. 如果我导入python的内置50,程序将从终端Queue退出
  2. 如果我定义了自定义KeyboardInterrup(内部实现为class Queue(object)),则线程会在list之后继续打印到终端。
  3. 以下是我的代码: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
    >>>
    

1 个答案:

答案 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