2017-04-17 37 views
1

我試圖做一個獨立的循環,因爲第二個使用raw_input()等待輸入。要做到這一點,我發現做這件事的最好方法是多線程,我試圖弄清楚它是如何工作的。我寫了這個:多線程簡介 - 一次運行2個循環

from threading import Thread 
import time 
def loopA(): 
    while True: 
     print "1" 
     time.sleep(1) 
def loopB(): 
    while True: 
     print "2" 
     time.sleep(1) 
threadA = Thread(target = loopA) 
threadB = Thread(target = loopB) 
threadA.run() 
threadB.run() 

threadA.join() 
threadB.join() 

I`d期望看到什麼是1S和2S的一排被印刷到外殼,但它是所有1S的只是一排。如何獲得第二個線程?

編輯:行,所以我提出:

from threading import Thread 
import time 
def loopA(): 
    while True: 
     print "1" 
     time.sleep(1) 
if __name__ == "__main__": 
    Thread(target = loopA).start() 
    while True: 
     n = raw_input("enter here:") 
     print n 

我現在想的是1正在打印一遍又一遍,每當我寫的東西並回車,它應該只是得到打印出來,但1的循環不應該停止。

+0

你的第二個代碼適合我......你有什麼? – Aaron

+1

您的線程正在爭奪非同步資源,特別是控制檯。如果我將loopA的循環設置爲sleep 10,則可以輸入「12345」並等待打印,然後繼續輸入「67890」,raw_input獲得「67890」。 print語句強制控制檯丟棄所有內容並從raw_input開始。 –

+0

第二個代碼:我希望每秒打印1個,即使我正在寫入輸入,也沒有按回車。輸入會停止進程並等待,直到我返回時,我希望它不會與循環進行混淆。 –

回答

0

我不確定你在用你的第二個例子來查找你的輸入,因爲它看起來像我期望的那樣工作。至於你的第一個例子,你用Thread.run()而不是Thread.start()run屬性是對實際可調用的引用(在這種情況下爲target),併爲子類化提供了線程類。調用run()不會啓動一個新的執行線程,而只是在主線程中調用目標函數。這就是爲什麼你的第二個線程從未在第一個例子中啓動的原因。從run更改爲start解決了此問題。

+0

第二個問題可能依賴於操作系統 –

+0

@KennyOstrom不在[當前版本](https://github.com/python-git/python/blob/master/Lib/threading.py#L474)至少......'運行「是一個簡單的」調用目標「功能,並提供一點保護以避免自我引用。 – Aaron

+0

幫助,仍然還沒有在我的目標壽。它做了我想要的,但是(請參閱原始文章中的評論),一旦調用raw_input()函數,它會停下來,直到我寫入內容爲止。 –