如何中断线程中文件行的迭代

How to break an iteration on file lines in a thread

我的应用程序中有一个在 stdin 上侦听的阅读线程。它会阻塞,直到有一些输入可用。当一些到达时,它接受这些行,检查它们是否是有效命令并将它们放入队列中。

def ReadCommands( queue ):
    for cmd in stdin:
        if cmd=="":
            break
        # Check if cmd is valid and add to queue

queue = Queue()
thread = Thread( target=ReadCommands, args=( queue, ) )
thread.start()

现在主程序要退出,首先要加入这个读线程。问题是线程处于我无法控制的循环中。即使 stdin.close() 也不行。

如何打破主阅读线程中的 for 循环?

或者,我如何编写 for 循环(需要一段时间?)才能添加我自己的会中断循环的布尔变量?请注意,我不想要一个活跃的等待循环!

如果您有只想在退出程序时关闭的线程,那么在 daemon mode 中启动它们通常是最好的方法。如果所有非守护线程都退出,您的应用程序将结束,并带走所有守护线程。

请注意,您应该只对不必执行清理的线程执行此操作;你的例子似乎适合这个。 此外,如果您正在执行阻塞的 C 级操作,守护线程可能仍会阻塞,直到它 returns 到达实际的 python 范围。在那种情况下,没有 python 级别选项来打破块开始。例如,从损坏的套接字中读取可能是一个问题。


如果您需要在停止程序之前明确终止阻塞线程,您可能必须使用 python's C-API。这可以更干净地实现,但原则上有效。