當前位置: 妍妍網 > 辦公

詳解Python多執行緒使用技巧

2024-07-01辦公

多執行緒是一種能夠並行執行程式碼的方法,可以提高程式的執行效率和響應速度。本文將詳細介紹 Python 中多執行緒的概念、使用場景、基本用法以及實際套用,可以更好地掌握多執行緒編程。

什麽是多執行緒?

多執行緒是指在單個行程內並行執行多個執行緒的技術。每個執行緒共享相同的記憶體空間,可以並列執行任務。多執行緒的主要目的是提高程式的並行性,從而提升執行效率。

多執行緒的使用場景

  1. I/O 密集型任務 :如檔讀寫、網路請求等。

  2. 使用者介面響應 :確保 GUI 程式在執行後台任務時仍能響應使用者操作。

  3. 並行數據處理 :處理大規模數據集時,提高數據處理效率。

Python 中的多執行緒模組

Python 提供了 threading 模組來實作多執行緒。該模組提供了建立和管理執行緒的基本功能。

建立執行緒

使用 threading.Thread 類可以建立一個新執行緒。以下是一個簡單的範例:

import threading
defprint_numbers():
for i in range(10):
print(i)
# 建立執行緒
thread = threading.Thread(target=print_numbers)
# 啟動執行緒
thread.start()
# 等待執行緒完成
thread.join()

使用執行緒類

除了使用 target 參數指定函式外,還可以透過繼承 threading.Thread 類來建立執行緒:

import threading
classMyThread(threading.Thread):
defrun(self):
for i in range(10):
print(i)
# 建立執行緒例項
thread = MyThread()
# 啟動執行緒
thread.start()
# 等待執行緒完成
thread.join()

執行緒同步

由於多個執行緒共享相同的記憶體空間,因此需要確保對共享資源的存取是執行緒安全的。可以使用 threading.Lock 實作執行緒同步。

import threading
lock = threading.Lock()
counter = 0
defincrement_counter():
global counter
with lock:
for _ in range(100000):
counter += 1
# 建立多個執行緒
threads = [threading.Thread(target=increment_counter) for _ in range(10)]
# 啟動所有執行緒
for thread in threads:
thread.start()
# 等待所有執行緒完成
for thread in threads:
thread.join()
print(f"Final counter value: {counter}")




執行緒間通訊

可以使用 queue.Queue 實作執行緒間通訊:

import threading
import queue
defproducer(q):
for i in range(5):
q.put(i)
print(f"Produced {i}")
defconsumer(q):
whileTrue:
item = q.get()
if item isNone:
break
print(f"Consumed {item}")
q.task_done()
q = queue.Queue()
thread_producer = threading.Thread(target=producer, args=(q,))
thread_consumer = threading.Thread(target=consumer, args=(q,))
thread_producer.start()
thread_consumer.start()
thread_producer.join()
q.put(None) # Signal the consumer to exit
thread_consumer.join()



多執行緒的實際套用

實作並行網路請求

在實際開發中,常常需要發送大量的網路請求。傳統的序列處理方法效率較低,透過使用多執行緒,可以顯著提高並行請求的速度。假設需要從多個網站抓取數據,並且希望盡可能快速地完成這項任務。透過多執行緒,可以同時向多個網站發送請求,而不是一個一個地請求,從而大大減少總的執行時間。

使用 requests 庫來發送 HTTP 請求,使用 threading 庫來實作多執行緒。

import threading
import requests
# 待抓取的URL列表
urls = [
"https://www.example.com",
"https://www.python.org",
"https://www.github.com",
# 更多URL...
]
# 定義執行緒函式
deffetch_url(url):
try:
response = requests.get(url)
print(f"Fetched {url} with status {response.status_code}")
except requests.RequestException as e:
print(f"Error fetching {url}{e}")
# 建立並啟動執行緒
threads = []
for url in urls:
thread = threading.Thread(target=fetch_url, args=(url,))
threads.append(thread)
thread.start()
# 等待所有執行緒完成
for thread in threads:
thread.join()


在上述程式碼中,定義了一個 fetch_url 函式來發送 HTTP 請求,並在主執行緒中建立並啟動多個子執行緒,每個執行緒負責抓取一個 URL。

實作生產者-消費者模式

生產者-消費者模式是一種經典的多執行緒編程模式,常用於處理需要動態生成和消費數據的場景。透過使用執行緒安全的佇列(如 queue.Queue ),我們可以方便地實作這一模式。假設有一個生產者執行緒,不斷生成數據(例如從檔或資料庫中讀取數據),並將數據放入佇列中。同時,有多個消費者執行緒,從佇列中取出數據並進行處理。使用多執行緒可以讓生產和消費過程並列進行,從而提高效率。

以下是一個使用生產者-消費者模式的範例程式碼:

import threading
import queue
import time
# 建立佇列
q = queue.Queue()
# 定義生產者函式
defproducer():
for i in range(10):
item = f"item_{i}"
q.put(item)
print(f"Produced {item}")
time.sleep(1) # 模擬生產過程中的延遲
# 定義消費者函式
defconsumer():
whileTrue:
item = q.get()
if item isNone:
break
print(f"Consumed {item}")
q.task_done()
time.sleep(2) # 模擬消費過程中的延遲
# 建立並啟動生產者執行緒
producer_thread = threading.Thread(target=producer)
producer_thread.start()
# 建立並啟動多個消費者執行緒
consumer_threads = []
for _ in range(3):
thread = threading.Thread(target=consumer)
consumer_threads.append(thread)
thread.start()
# 等待生產者執行緒完成
producer_thread.join()
# 向佇列中放入None,通知消費者執行緒結束
for _ in range(3):
q.put(None)
# 等待所有消費者執行緒完成
for thread in consumer_threads:
thread.join()
print("All tasks are done.")







在這個範例中,建立了一個 queue.Queue 物件作為共享佇列,並定義了生產者和消費者函式。生產者函式生成數據並將其放入佇列,消費者函式從佇列中取出數據進行處理。透過 q.task_done() q.join() ,我們可以確保所有任務都被處理完畢。

總結

本文介紹了 Python 中多執行緒的基本概念、使用場景、建立和管理執行緒的方法,以及執行緒同步和執行緒間通訊的實作。透過範例程式碼,展示了如何在實際套用中使用多執行緒來提高程式的執行效率和響應速度。

最後順便推薦一下,本文作者濤哥和前字節工程師共同出品的「 出海賺錢專欄 」,真的幹貨滿滿。

1倍努力賺7倍人民幣收益, 在國內已經太卷的環境下,多一個選擇的可能,也許會幫你找到新的路子!現在早鳥期僅售14元,需要的朋友趕緊上車吧~(哪怕一篇文章有用也超值了吧)

掃圖中二維碼可購買↓

Crossin的新書【 碼上行動:用ChatGPT學會Python編程 】已經上市了。 本書以ChatGPT為輔助,系統全面地講解了如何掌握Python編程,適合Python零基礎入門的讀者學習。

購買後可加入讀者交流群,Crossin為你開啟陪讀模式,解答你在閱讀本書時的一切疑問。

Crossin的其他書籍:

添加微信 crossin123 ,加入編程教室共同學習 ~

感謝 轉發 點贊 的各位~