当前位置: 首页 > 面试题库 >

终止多线程python程序

和和煦
2023-03-14
问题内容

如何使多线程python程序响应Ctrl + C键事件?

编辑: 代码是这样的:

import threading
current = 0

class MyThread(threading.Thread):
    def __init__(self, total):
        threading.Thread.__init__(self)
        self.total = total

    def stop(self):
        self._Thread__stop()

    def run(self):
        global current
        while current<self.total:
            lock = threading.Lock()
            lock.acquire()
            current+=1
            lock.release()
            print current

if __name__=='__main__':

    threads = []
    thread_count = 10
    total = 10000
    for i in range(0, thread_count):
        t = MyThread(total)
        t.setDaemon(True)
        threads.append(t)
    for i in range(0, thread_count):
        threads[i].start()

我试图在所有线程上删除join(),但仍然无法正常工作。是否因为每个线程的run()过程中的锁段?

编辑: 上面的代码应该可以工作,但是当当前变量在5,000-6,000范围内并遍历以下错误时,它总是会中断

Exception in thread Thread-4 (most likely raised during interpreter shutdown):
Traceback (most recent call last):
  File "/usr/lib/python2.5/threading.py", line 486, in __bootstrap_inner
  File "test.py", line 20, in run
<type 'exceptions.TypeError'>: unsupported operand type(s) for +=: 'NoneType' and 'int'
Exception in thread Thread-2 (most likely raised during interpreter shutdown):
Traceback (most recent call last):
  File "/usr/lib/python2.5/threading.py", line 486, in __bootstrap_inner
  File "test.py", line 22, in run

问题答案:

在启动主线程之前,将除主线程之外的每个线程都设为守护进程(t.daemon = True在2.6或更高版本中,t.setDaemon(True)在2.6或更低版本中,针对每个线程对象t)。这样,当主线程收到KeyboardInterrupt时,如果它没有捕获到或捕获到它,但是无论如何都决定终止,则整个过程将终止。请参阅文档。

编辑 :刚刚看过OP的代码(最初未发布)和声称“它不起作用”,看来我必须添加…:

当然,如果你希望你的主线程保持响应(例如,为了控制-C),不泥潭成阻塞调用,如join荷兰国际集团另一个线程-尤其是没有完全 无用的
阻塞调用,如join荷兰国际集团 守护 线程。例如,仅更改当前线程在主线程中的最终循环(完全无损):

for i in range(0, thread_count):
    threads[i].join()

像这样更明智:

while threading.active_count() > 0:
    time.sleep(0.1)

如果您的main没有比将所有线程自己终止或接收control-C(或其他信号)更好的事情了。

当然,如果您不想让线程突然终止(如守护线程可能),还有许多其他可用的模式-除非 它们 也被永久地陷入无条件阻塞的调用,死锁等;-) 。



 类似资料:
  • 主要内容:1 什么是Java终止线程,2 Thread类终止线程的方法,3 Java终止线程的例子1,4 Java终止线程的例子2,5 Java终止线程的例子3,6 isInterrupted和interrupted方法1 什么是Java终止线程 如果任何线程处于睡眠或等待状态(即,调用sleep()或wait()方法),则在线程上调用interrupt()方法,会抛出InterruptedException中断睡眠或等待状态。如果线程未处于睡眠或等待状态,则调用interrupt()方法将执行

  • 问题内容: 我正在学习如何使用Python多处理库。但是,当我浏览一些示例时,最终我在后台运行了许多python进程。 其中的例子看起来象下面这样: 现在,这是我的“ TOP”命令的屏幕截图: 我不知道如何一口气杀死他们。 ps … | grep python ....杀死吗? 我需要添加哪种python代码,以避免再次发生这种悲惨的情况。谢谢! 问题答案: 您需要在工作队列中处理您的进程,该进程

  • 我尝试构建一个GUI应用程序,从相机抓取帧并在Tkinter GUI中显示它们。Tkinter mainloop在主线程中执行,而gui的帧抓取和更新在单独的线程中进行。 下面的代码作为一个视频流被抓取并正确显示在我的gui窗口中。但是,当我通过单击“x”来调用on_close()方法来关闭gui时,gui将关闭,但程序不会完全终止。最后一次CLI输出将为“Mainloop stopped!”,但

  • 问题内容: 当我测试创建子线程的方法的执行时,JUnit测试会在子线程之前终止并杀死它。 我如何强制JUnit等待子线程完成其执行? 谢谢 问题答案: 阅读问题和评论后,似乎您需要的是 一种对异步操作进行单元测试的技术 。doSomething()立即返回,但是您希望测试代码等待其完成,然后进行一些验证。 问题在于该测试无法识别该调用所产生的线程,因此显然它无法等待它们。人们可以想到许多复杂的(可

  • 请帮助我处理这个主线程/父线程将触发子线程。如果我们停止父线程/主线程,它还必须停止所有子线程/子线程 我想用中断做这件事,但做不到。请帮我把代码弄出来 以及如何确保所有子线程都已停止?有什么办法也可以做到这一点吗 提前谢谢! 我正在尝试这样做: 公共类ThreadTest1扩展Thread{私有静态最终记录器LOGGER=Logger.get记录器(mylogger); }