我的应用程序中有一个阅读线程,可以监听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循环(有一段时间?)以便能够添加我自己的布尔变量来破坏循环?请注意,我不想要一个活跃的等待循环!
答案 0 :(得分:1)
如果你有线程只想在退出程序时关闭,那么在daemon mode中启动它通常是最好的方法。如果所有非守护程序线程都退出,则应用程序将结束,并使用所有守护程序线程。
请注意,您只应对不必执行清理的线程执行此操作;你的例子似乎很好。 此外,如果您正在执行阻塞C级操作,守护程序线程可能仍会阻塞,直到它返回到实际的python范围。在这种情况下,没有python级别选项来打破块开始。例如,从破损的套接字读取可能是一个问题。
如果您需要在停止程序之前显式终止阻塞线程,则可能必须使用python's C-API。这可以更干净地实施,但原则上是有效的。