2015-10-13 54 views
0

我在我的应用程序中有一个阅读线程,用于侦听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

threading.event可能会对您有所帮助。你可以通过is_set()来检查退出条件。 –

+0

这是链接:https://docs.python.org/2/library/threading.html#event-objects –

+0

我不认为这与你的问题有关,但不是'args'应该是一个元组?在这种情况下,您应该执行'args =(queue,)' – Kevin

回答

1

如果您有退出程序时只想关闭的线程,则在daemon mode中启动它们通常是最佳方式。如果所有非守护进程线程都退出,您的应用程序将结束,并且所有守护进程线程都会退出。

请注意,您应该只对不需要执行清理的线程执行此操作;你的例子似乎对此很好。另外,如果您正在执行阻止C级操作,则守护进程线程可能仍会阻塞,直到它返回到实际的python作用域。在这种情况下,没有python level选项可以打开块。例如,从破损的套接字读取可能是这样的问题。


如果你需要停止你的程序之前明确地杀死一个阻塞线程,你可能会使用python's C-API。这可以更干净地实施,但原则上工作。