2016-05-24 37 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

相关问题