初學者看過來:Python中多執行緒和多處理的指南

大雄45發表於2020-05-14
使用Python分析資料,如果使用了正確的資料結構和演算法,有時可以大量提高程式的速度。實現此目的的一種方法是使用Muiltithreading(多執行緒)或Multiprocessing(多重處理)。

使用Python分析資料,如果使用了正確的資料結構和演算法,有時可以大量提高程式的速度。實現此目的的一種方法是使用Muiltithreading(多執行緒)或Multiprocessing(多重處理)。

在這篇文章中,我們不會詳細討論多執行緒或多處理的內部原理。相反,我們舉一個例子,編寫一個小的Python 從Unsplash下載影像。我們將從一次下載一個影像的版本開始。接下來,我們使用執行緒來提高執行速度。

初學者看過來:Python中多執行緒和多處理的指南初學者看過來:Python中多執行緒和多處理的指南

Python中多執行緒和多處理的初學者指南

多執行緒

簡單地說,執行緒允許您並行地執行程式。花費大量時間等待外部事件的任務通常適合執行緒化。它們也稱為I/O Bound任務例如從檔案中讀寫,網路操作或使用API線上下載。讓我們來看一個示例,它展示了使用執行緒的好處。

1. 沒有執行緒

在本例中,我們希望透過順序執行程式來檢視從Unsplash API下載15張影像需要多長時間:

import requests 
import time 
img_urls = [ 
    'https://images.unsplash.com/photo-1516117172878-fd2c41f4a759', 
    'https://images.unsplash.com/photo-1532009324734-20a7a5813719', 
    'https://images.unsplash.com/photo-1524429656589-6633a470097c', 
    'https://images.unsplash.com/photo-1530224264768-7ff8c1789d79', 
    'https://images.unsplash.com/photo-1564135624576-c5c88640f235', 
    'https://images.unsplash.com/photo-1541698444083-023c97d3f4b6', 
    'https://images.unsplash.com/photo-1522364723953-452d3431c267', 
    'https://images.unsplash.com/photo-1513938709626-033611b8cc03', 
    'https://images.unsplash.com/photo-1507143550189-fed454f93097', 
    'https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e', 
    'https://images.unsplash.com/photo-1504198453319-5ce911bafcde', 
    'https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99', 
    'https://images.unsplash.com/photo-1516972810927-80185027ca84', 
    'https://images.unsplash.com/photo-1550439062-609e1531270e', 
    'https://images.unsplash.com/photo-1549692520-acc6669e2f0c' 
] 
 
start = time.perf_counter() #start timer 
for img_url in img_urls: 
    img_name = img_url.split('/')[3] #get image name from url 
    img_bytes = requests.get(img_url).content 
with open(img_name, 'wb') as img_file: 
     img_file.write(img_bytes) #save image to disk  
 
finish = time.perf_counter() #end timer 
print(f"Finished in {round(finish-start,2)} seconds")  
 
#results 
Finished in 23.101926751 seconds

一共用時23秒。

2. 多執行緒

讓我們看看Pyhton中的執行緒模組如何顯著地改進我們的程式執行:

import time 
from concurrent.futures import ThreadPoolExecutor 
 
def download_images(url): 
    img_name = img_url.split('/')[3] 
    img_bytes = requests.get(img_url).content 
    with open(img_name, 'wb') as img_file: 
         img_file.write(img_bytes) 
         print(f"{img_name} was downloaded") 
 
start = time.perf_counter() #start timer 
with ThreadPoolExecutor() as executor: 
    results = executor.map(download_images,img_urls) #this is Similar to map(func, *iterables) 
finish = time.perf_counter() #end timer 
print(f"Finished in {round(finish-start,2)} seconds") 
 
#results  
Finished in 5.544147536 seconds

我們可以看到,與不使用執行緒程式碼相比,使用執行緒程式碼可以顯著提高速度。從23秒到5秒。

對於本例,請注意在建立執行緒時存在開銷,因此將執行緒用於多個API呼叫是有意義的,而不僅僅是單個呼叫。

此外,對於密集的計算,如資料處理,影像處理多處理比執行緒執行得更好。

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2692251/,如需轉載,請註明出處,否則將追究法律責任。

相關文章