2015-05-05 15 views
0

查看KeyboardInterrupt以退出多線程腳本後,我想知道是否可以使用鍵盤上的向上和向下鍵來增加/減少正在使用的線程數量?這將希望以與KeyboardInterrupt相同的方式發生,以便隨時可能發生。是這樣的可能嗎?還是有另一種方法會更適合這個?如何通過使用特定鍵的鍵盤中斷來更改python腳本中的對象?

def do_something(input_file, threads): 
concurrent = threads 
l = read_csv(input_file) 

for i in range(concurrent): 
    t = Thread(target=create_accounts) 
    t.daemon = True 
    t.start() 
try: 
    for account in l: 
     q.put(account) 
    q.join() 
except KeyboardInterrupt: 
    sys.exit(1) 

if __name__ == '__main__': 

    threads = 1 
    q = Queue(threads * 2) 
    do_something('test.csv', threads) 

回答

1

A KeyboardInterrupt是一件特別的事情。在Unix上,Python基本上允許終端將^ C變成SIGINT信號,並且它爲SIGINT安裝一個信號處理程序,引發異常。在Windows上,它有點複雜,但基本思想相同。普通的按鍵不會中斷你的代碼。

但是,您可以專用線程來聆聽鍵盤。你的主線程似乎沒有做任何有用的事情;如果是這樣,那麼踢到後臺線程。然後,您的主線程可以坐在等待鍵盤輸入。

但是...你如何等待鍵盤輸入?這是棘手的部分。通常,在大多數平臺上,輸入是行緩衝的。箭頭鍵已經有了特殊的含義,比如循環瀏覽歷史記錄。

您可以在Windows上使用Console I/O,在Unix上使用termios),並學習關於字符代碼的整個混亂業務,以便實際識別箭頭鍵。但是你可能會發現使用更高級別的包裝器會容易得多。有各種各樣的選擇,從getchconsoleio到PyGame或Qt;搜索PyPI。

+0

想要知道在最底層是多麼有趣,[這裏](http://pastebin.com/hKsyp3Vq)是一個簡單的程序(Python 3.4,僅限於Unix),可以讀取您的字符直到你打回來,然後顯示你按下的向上和向下箭頭。如果你認爲這很可怕,那麼這就是爲什麼你想要一個更高級別的包裝。 :) – abarnert

+0

你會推薦什麼乾淨的方式來使用主線程等待鍵盤輸入?主要希望它能夠輸入一些東西來增加線程的數量,但我覺得這可能對我有任何多線程應用程序有用。你的迴應已經達到了我的好奇心。謝謝(你的)信息。 – Jeff

+0

@Jeff:你需要跨平臺嗎?因爲根據我的經驗,與跨平臺的很好的平臺相比,有更多的純Windows和純Unix控制檯輸入庫。但是我不知道現在的藝術狀況。你可能不得不自己挖掘PyPI。 – abarnert