2017-02-27 233 views
0

雖然我搜索了很多結果,但他們不是我想要的。我的主要代碼如下如何等待所有線程完成?

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://stackoverflow.com/questions/15085348/what-is-the-use- python-threading – EvanL00

回答

2

有缺少代碼的樣本中,我猜你是在你的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