2015-10-13 42 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。這可以更乾淨地實施,但原則上工作。