如何等待所有线程完成?

问题描述:

虽然我搜索了很多结果,但他们不是我想要的。我的主要代码如下如何等待所有线程完成?

def main: 
    start = datetime.now() 
    browser = webdriver.PhantomJS() 
    download() 
    browser.quit() 
    showTime() 

def download: 
    for imageSecond in imageSeconds: 
     urlServer = imageSecond.get("src") 
     pathLocal = formatPath(downloadLocationPath, ntpath.basename(urlServer)) 

     if not os.path.isfile(pathLocal): 
      ts.append(createNewDownloadThread(browser, urlServer, pathLocal)) 
     else: 
      logger.info('Downloaded: {}'.format(urlServer + " -> " + pathLocal)) 
      showTime() 

    for t in ts: 
     t.join() 

def showTime: 
    end = datetime.now() 
    runtime = end - start 
    logger.info('Sta Time: {}'.format(start)) 
    logger.info('End Time: {}'.format(end)) 
    logger.info('Run Time: {}'.format(runtime)) 
    sys.exit(0) 

我得到的输出如下

2017-02-27 09:42:12,817 - INFO - MainThread - Downloaded: https://secure-api.userlocal.jp 
2017-02-27 09:42:12,833 - INFO - MainThread - Sta Time: 2017-02-27 09:41:43.895126 
2017-02-27 09:42:12,833 - INFO - MainThread - End Time: 2017-02-27 09:42:12.833492 
2017-02-27 09:42:12,833 - INFO - MainThread - Run Time: 0:00:28.938366 
2017-02-27 09:42:12,849 - INFO - Thread-323 - Download: https://secure-api.userlocal.jp 
2017-02-27 09:42:12,849 - INFO - Thread-324 - Download: https://secure-api.userlocal.jp 

但我想如下输出什么,我该怎么办?

2017-02-27 09:42:12,817 - INFO - MainThread - Downloaded: https://secure-api.userlocal.jp 
2017-02-27 09:42:12,849 - INFO - Thread-323 - Download: https://secure-api.userlocal.jp 
2017-02-27 09:42:12,849 - INFO - Thread-324 - Download: https://secure-api.userlocal.jp 
2017-02-27 09:42:12,833 - INFO - MainThread - Sta Time: 2017-02-27 09:41:43.895126 
2017-02-27 09:42:12,833 - INFO - MainThread - End Time: 2017-02-27 09:42:12.833492 
2017-02-27 09:42:12,833 - INFO - MainThread - Run Time: 0:00:28.938366 
+0

这可能会帮助:http://*.com/questions/15085348/what-is-the-use- python-threading – EvanL00

有缺少代码的样本中,我猜你是在你的createNewDownloadThread以上()方法调用newthread.start(),不是吗?

你可能知道通常的工作方式是调用thread.start()和thread.join(),所以它会阻塞直到线程结束。

我说这可能是由你做这个循环效果更好:

for t in ts: 
     t.start() 
     t.join() 
+0

我在createNewDownloadThread中启动它,你的代码不是我所需要的,因为线程没有并行。然后我发现了一个奇怪的结果,上面的结果与PhantomJS一起使用,如果我使用ChromeDriver,结果就是我所需要的,我不知道为什么...... – mikezang

+0

啊!,可能是因为PhantomJS是单线程的,它不能正常工作在你的多线程代码中。 – mydaemon

+0

真的吗?我也发现PhantomJS在Mac上很慢,所以PhantomJS对我的情况不好?我可以使用ChromeDriver吗? – mikezang