Python阻止线程终止方法



我在Python编程中有一个问题。我正在编写一个有线程的代码。该线程是一个阻塞的线程。阻止线程表示:线程正在等待事件。如果未设置事件,则该线程必须等到设置事件。我期望块线程必须等待事件,而无需等待!
启动阻塞线程后,我写一个永远的循环来计算计数器。问题是:当我想通过CTRL C终止我的Python程序时,我无法正确终止阻塞线程。这个线程还活着!我的代码在这里。

import threading
import time
def wait_for_event(e):
    while True:
        """Wait for the event to be set before doing anything"""
        e.wait()
        e.clear()
        print "In wait_for_event"
e = threading.Event()
t1 = threading.Thread(name='block',
                      target=wait_for_event,
                      args=(e,))
t1.start()
# Check t1 thread is alive or not
print "Before while True. t1 is alive: %s" % t1.is_alive()
counter = 0
while True:
    try:
        time.sleep(1)
        counter = counter + 1
        print "counter: %d " % counter
    except KeyboardInterrupt:
        print "In KeyboardInterrupt branch"
        break
print "Out of while True"
# Check t1 thread is alive
print "After while True. t1 is alive: %s" % t1.is_alive()

输出:

$ python thread_test1.py
Before while True. t1 is alive: True
counter: 1
counter: 2
counter: 3
^CIn KeyboardInterrupt branch
Out of while True
After while True. t1 is alive: True

有人可以给我帮助吗?我想问两个问题。
1.我可以通过CTRL C停止阻止线程吗?如果可以的话,请给我一个可行的方向。
2.如果我们通过CTRL 键盘停止Python程序或重置正在运行Python程序的硬件(示例,PC),则可以终止阻塞线程?

ctrl c 仅停止主线程,您的线程不在daemon模式下,这就是它们继续运行的原因,这就是使过程活着的原因。首先将您的线程变成守护程序。

t1 = threading.Thread(name='block',
                      target=wait_for_event,
                      args=(e,))
t1.daemon = True
t1.start()

对于其他线程类似。但是还有另一个问题 - 一旦主线程启动了您的线程,就没有其他要做的事情了。因此,它退出了,线程立即被破坏。因此,让我们保持主线程的活力:

import time
while True:
    time.sleep(1)

请看一下,希望您能得到其他答案。

如果您需要杀死所有运行Python的进程,则可以简单地从命令行中运行Pkill Python。这有点极端,但会起作用。

另一种解决方案是在您的代码内使用锁定,请参见以下信息:

相关内容

  • 没有找到相关文章