2016-05-24 44 views
1

的Python 2.6.6Python的線程 - 做一些事情,而join()方法

我哈瓦要執行的線程列表和主代碼將等待(Threading.join()),直到他們全部完成。

>>> for thread in threadList: 
...  thread.start() 
>>> for t in threadList: 
...  t.join() 

有沒有辦法打印,如「跑......」,而主代碼等待線程結束的消息?

我想在第二秒後打印同樣的東西(「running ...」),直到線程全部完成。

謝謝。


解決

實施的解決方案:

>>> for thread in threadList: 
...  thread.start() 
>>> string = "running" 
>>> while any(t.is_alive() for t in threadList): 
... sys.stdout.write("\r%s" % string) 
... sys.stdout.flush() 
... string = string + "."      #this may not be the best way 
... time.sleep(0.5) 

在我的情況下,額外的時間 「time.sleep(0.5)」 是不是一個問題,但它不是最推薦的。

這產生輸出:

running........ 

的點之後的「運行」將被打印在一個後,在同一行上,同時有任何線程活着。完全如我所料!

根據@Manuel Jacob和@Alex Hall的回答。

回答

3

的Thread.join()是BLO通過設計製作。而不是使用Thread.join(),你可以定期調用Thread.is_alive()。

你的榜樣適應:

for thread in threadList: 
    thread.start() 
while any(thread.is_alive() for thread in threadList): 
    print('running...') 
    time.sleep(1) 

正如在評論中指出,這可能會導致高達額外的延遲一秒,當最後一個線程在睡眠過程中完成。

+0

這會導致多達一秒的額外等待時間。 –

+0

謝謝,曼努埃爾雅各!它工作得很好。我會更新問題以顯示我的結果。 – HeitorLima

0
from time import sleep 
from threading import Thread 

threadList = [Thread(target=lambda: sleep(3)), Thread(target=lambda: sleep(5))] 

for thread in threadList: 
    thread.start() 

def check_running(): 
    while True: 
     alive = sum(thread.is_alive() for thread in threadList) 
     if not alive: 
      break 
     print '%s threads still running...' % alive 
     sleep(1) 

Thread(target=check_running).start() 

for t in threadList: 
    t.join() 

輸出:

2 threads still running... 
2 threads still running... 
2 threads still running... 
1 threads still running... 
1 threads still running... 

或者:

from time import sleep 
from threading import Thread 

threadList = [Thread(target=lambda: sleep(3), name='Alice'), Thread(target=lambda: sleep(5), name='Bob')] 

for thread in threadList: 
    thread.start() 

for t in threadList: 
    while True: 
     t.join(timeout=1) 
     if not t.is_alive(): 
      break 
     print('%s is still running...' % t.name) 

輸出:

​​
+0

你還應該加入'check_running'線程末尾 – njzk2

+0

@ njzk2爲什麼?這會導致程序花費更長的時間完成,我們不關心它。 –

+0

只是爲了確保一切都關閉,並且如果有任何監視器線程有bug並且沒有終止的機會,我可以用一個連接來替換連接的循環到監視器線程 – njzk2

相關問題