2017-02-24 52 views
0

我用下面的代碼作爲多線程來下載圖片,但是我發現速度不是很快,我不知道爲什麼,有沒有人爲我做expalin?即使使用多線程,爲什麼不快?

普通下載:

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

def downloadImage(browser, urlServer, pathLocal): 

線程下載:

ts = [] 
for imageSecond in imageSeconds: 
    urlServer = imageSecond.get("src") 
    pathLocal = formatPath(downloadLocationPath, ntpath.basename(urlServer)) 
    ts.append(createNewDownloadThread(browser, urlServer, pathLocal)) 

for t in ts: 
    t.join() 

def createNewDownloadThread(browser, urlServer, pathLocal): 
    download_thread = threading.Thread(target=downloadImage, args=(browser, urlServer, pathLocal)) 
    download_thread.start() 
    return download_thread#.join() 

def downloadImage(browser, urlServer, pathLocal): 
+0

最有可能的原因是:瓶頸是您的網絡連接,把更多的CPU內核,以simultaneosly使用它無助於改善這一點。 – guidot

回答

0

Python docs

加入(超時=無) 等待,直到線程終止。這會阻塞調用線程,直到調用join()方法的線程終止 - 通常或通過未處理的異常 - 或直到發生可選的超時。

因此,您正在創建一個線程,等待它完成下載,然後創建另一個線程進行下載,這與您的原始解決方案基本相同。

更新你可以使用concurrent.futures它提供了簡單的接口:

import concurrent.futures as cf 

def square(x): 
    return x*x 

with cf.ThreadPoolExecutor(10) as executor: 
    futures = [executor.submit(square, i) for i in range(5)] 
    cf.wait(futures) 

    for f in futures: 
     print(f.result()) 

輸出:

0 
1 
4 
9 
16 

與您的代碼會是這個樣子:

NUM_THREADS = 10 
with cf.ThreadPoolExecutor(NUM_THREADS) as executor: 
    futures = [] 
    for imageSecond in imageSeconds: 
     urlServer = imageSecond.get("src") 
     pathLocal = formatPath(downloadLocationPath, ntpath.basename(urlServer)) 
     futures.append(executor.submit(downloadImage, browser, urlServer, pathLocal)) 

    cf.wait(futures) 
+0

如果我不使用加入,我發現下載圖像不是我所需要的,我可以修改我的代碼以進行並行下載,但沒有錯誤? – mikezang

+0

@mikezang增加了'concurrent.futures'的簡單例子。如果你想堅持使用'threading',首先創建線程,將它們存儲到列表中,然後逐個加入它們。 – niemmi

+0

我剛修改我的代碼,然後速度比原來的速度快2倍,反正有更快? – mikezang

-1

使用代碼如下

ts = [] 

for: 
    t = createThread() 
    t.start() 
    ts.append(t) 

for t in ts: 
    t.join() 

的,而不是代碼

for: 
    t = createThread() 
    t.start() 
    t.join() 
相關問題