最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python多線程編程的核心概念與實踐方法

 更新時間:2026年05月12日 16:50:21   作者:detayun  
線程(Thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,多線程就是在一個程序中同時運(yùn)行多個線程,讓它們"看起來"在同時執(zhí)行不同的任務(wù),本文介紹了Python多線程編程的核心概念與實踐方法,感興趣的小伙伴可以了解下

一、什么是多線程?

線程(Thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。一個進(jìn)程可以包含多個線程,這些線程共享進(jìn)程的資源(如內(nèi)存、文件句柄等),但每個線程有自己獨立的執(zhí)行棧和程序計數(shù)器。

多線程就是在一個程序中同時運(yùn)行多個線程,讓它們"看起來"在同時執(zhí)行不同的任務(wù)。

二、為什么要用多線程

1. 提升I/O密集型任務(wù)的效率

當(dāng)程序需要等待網(wǎng)絡(luò)請求、數(shù)據(jù)庫查詢、文件讀寫等I/O操作時,單線程會一直"傻等"。而多線程可以讓一個線程等待時,另一個線程繼續(xù)執(zhí)行其他任務(wù)。

舉例

  • 單線程:下載10張圖片,每張等待1秒,總共10秒
  • 多線程:同時下載10張圖片,總共約1秒

2. 提高用戶體驗

在GUI程序中,如果主線程被耗時操作阻塞,界面會"假死"。用多線程可以讓后臺任務(wù)運(yùn)行,界面保持響應(yīng)。

三、Python中的多線程模塊

Python提供了兩個主要的多線程模塊:

模塊說明適用場景
threading高級模塊,基于線程通用多線程編程
_thread低級模塊(很少直接用)底層控制

四、快速上手:創(chuàng)建線程

方法1:使用threading.Thread

import threading
import time

def task(name, seconds):
    print(f"線程 {name} 開始執(zhí)行")
    time.sleep(seconds)
    print(f"線程 {name} 執(zhí)行完畢")

# 創(chuàng)建線程
t1 = threading.Thread(target=task, args=("A", 2))
t2 = threading.Thread(target=task, args=("B", 1))

# 啟動線程
t1.start()
t2.start()

# 等待線程結(jié)束
t1.join()
t2.join()

print("所有線程執(zhí)行完畢")

輸出

線程 A 開始執(zhí)行
線程 B 開始執(zhí)行
線程 B 執(zhí)行完畢
線程 A 執(zhí)行完畢
所有線程執(zhí)行完畢

方法2:繼承threading.Thread類

import threading
import time

class MyThread(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name
    
    def run(self):
        print(f"線程 {self.name} 開始")
        time.sleep(2)
        print(f"線程 {self.name} 結(jié)束")

t = MyThread("自定義線程")
t.start()
t.join()

五、線程 vs 進(jìn)程

特性線程(Thread)進(jìn)程(Process)
創(chuàng)建開銷
內(nèi)存共享共享進(jìn)程內(nèi)存獨立內(nèi)存空間
切換速度
GIL限制受GIL影響(CPU密集型無效)不受GIL影響
適用場景I/O密集型CPU密集型

六、GIL(全局解釋器鎖)是什么?

GIL(Global Interpreter Lock) 是Python的一個機(jī)制,它保證同一時刻只有一個線程在執(zhí)行Python字節(jié)碼。

影響

  • I/O密集型任務(wù):多線程依然有效(等待時會釋放GIL)
  • CPU密集型任務(wù):多線程不會提升性能,反而可能更慢

解決方案

  • 使用 multiprocessing 模塊(多進(jìn)程)
  • 使用 concurrent.futures.ThreadPoolExecutor(線程池)
  • 使用 asyncio(異步編程)

七、線程同步:鎖(Lock)

當(dāng)多個線程同時修改共享數(shù)據(jù)時,可能會出現(xiàn)數(shù)據(jù)不一致的問題。這時需要用來保證線程安全。

import threading

balance = 0
lock = threading.Lock()

def deposit():
    global balance
    for _ in range(100000):
        lock.acquire()  # 加鎖
        try:
            balance += 1
        finally:
            lock.release()  # 解鎖

t1 = threading.Thread(target=deposit)
t2 = threading.Thread(target=deposit)

t1.start()
t2.start()
t1.join()
t2.join()

print(f"最終余額: {balance}")  # 正確輸出 200000

不加鎖的后果

# 去掉 lock,結(jié)果可能是 199847(數(shù)據(jù)不一致)

八、線程池:管理線程的最佳實踐

手動創(chuàng)建和銷毀線程效率低,推薦使用線程池。

使用ThreadPoolExecutor

from concurrent.futures import ThreadPoolExecutor
import time

def task(n):
    print(f"任務(wù) {n} 開始")
    time.sleep(1)
    return f"任務(wù) {n} 完成"

# 創(chuàng)建線程池(最多5個線程)
with ThreadPoolExecutor(max_workers=5) as executor:
    # 提交10個任務(wù)
    futures = [executor.submit(task, i) for i in range(10)]
    
    # 獲取結(jié)果
    for future in futures:
        print(future.result())

優(yōu)勢

  • 自動管理線程生命周期
  • 限制并發(fā)數(shù)量,避免資源耗盡
  • 簡潔的API

九、實際案例:批量下載圖片

import threading
import requests
from concurrent.futures import ThreadPoolExecutor

def download_image(url):
    try:
        response = requests.get(url, timeout=10)
        filename = url.split("/")[-1]
        with open(filename, "wb") as f:
            f.write(response.content)
        print(f"? 下載完成: {filename}")
    except Exception as e:
        print(f"? 下載失敗: {url}, 錯誤: {e}")

urls = [
    "https://example.com/image1.jpg",
    "https://example.com/image2.jpg",
    "https://example.com/image3.jpg",
]

# 使用線程池并發(fā)下載
with ThreadPoolExecutor(max_workers=3) as executor:
    executor.map(download_image, urls)

十、常見錯誤及解決方案

錯誤原因解決方案
RuntimeError: can't start new thread線程數(shù)超過系統(tǒng)限制使用線程池,限制并發(fā)數(shù)
數(shù)據(jù)不一致多線程同時修改共享數(shù)據(jù)使用 Lock
程序假死主線程被阻塞將耗時任務(wù)放到子線程
CPU密集型任務(wù)變慢GIL限制改用 multiprocessing 多進(jìn)程

十一、最佳實踐總結(jié)

  1. 優(yōu)先使用線程池ThreadPoolExecutor),不要手動創(chuàng)建線程
  2. I/O密集型任務(wù)用多線程,CPU密集型用多進(jìn)程
  3. 共享數(shù)據(jù)必須加鎖threading.Lock
  4. 設(shè)置合理的線程數(shù)(一般不超過 CPU核心數(shù) × 2)
  5. 避免在子線程中操作GUI(會崩潰)
  6. 不要過度創(chuàng)建線程(會耗盡系統(tǒng)資源)

十二、進(jìn)階學(xué)習(xí)路線

階段內(nèi)容
入門threading.ThreadLock、ThreadPoolExecutor
進(jìn)階queue.Queue(線程間通信)、Event、Condition
高級asyncio 異步編程、multiprocessing 多進(jìn)程
實戰(zhàn)爬蟲并發(fā)、Web服務(wù)器、GUI后臺任務(wù)

總結(jié)

Python多線程是處理I/O密集型任務(wù)的利器,但要注意GIL的限制和線程安全問題。記?。河镁€程池代替手動管理線程,用鎖保護(hù)共享數(shù)據(jù),用多進(jìn)程替代CPU密集型任務(wù)。

到此這篇關(guān)于Python多線程編程的核心概念與實踐方法的文章就介紹到這了,更多相關(guān)Python多線程編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實現(xiàn)小數(shù)轉(zhuǎn)化為百分?jǐn)?shù)的格式化輸出方法示例

    Python實現(xiàn)小數(shù)轉(zhuǎn)化為百分?jǐn)?shù)的格式化輸出方法示例

    這篇文章主要介紹了Python實現(xiàn)小數(shù)轉(zhuǎn)化為百分?jǐn)?shù)的格式化輸出方法,結(jié)合具體實例形式分析了Python實現(xiàn)小數(shù)轉(zhuǎn)換為百分?jǐn)?shù)輸出的相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2017-09-09
  • 分享6 個值得收藏的 Python 代碼

    分享6 個值得收藏的 Python 代碼

    這篇文章主要分享了6 個值得收藏的 Python 代碼,希望隊長正在學(xué)習(xí)的你有所幫助,需要的小伙伴也可以參考一下
    2022-01-01
  • Python字符串格式化常用手段及注意事項

    Python字符串格式化常用手段及注意事項

    這篇文章主要介紹了Python字符串格式化常用手段,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Python利用手勢識別實現(xiàn)貪吃蛇游戲

    Python利用手勢識別實現(xiàn)貪吃蛇游戲

    想必大家都玩過貪吃蛇的游戲吧:通過操縱蛇的移動方向能夠讓蛇吃到隨機(jī)出現(xiàn)的食物,吃到的食物越多,蛇就會變得越長。本文將使用手勢識別來完成貪吃蛇這個簡單的游戲,感興趣的可以了解一下
    2022-04-04
  • python中subplot大小的設(shè)置步驟

    python中subplot大小的設(shè)置步驟

    matploglib能夠繪制出精美的圖表,有時候我們希望把一組圖放在一起進(jìn)行比較,就需要用到matplotlib中提供的subplot了,這篇文章主要給大家介紹了關(guān)于python中subplot大小的設(shè)置方法,需要的朋友可以參考下
    2021-06-06
  • 利用python做數(shù)據(jù)擬合詳情

    利用python做數(shù)據(jù)擬合詳情

    這篇文章主要介紹了利用python做數(shù)據(jù)擬合,下面文章圍繞如何讓利用python做數(shù)據(jù)擬合的相關(guān)資料展開詳細(xì)內(nèi)容,需要的朋友可以參考一下,希望對大家有所幫助
    2021-11-11
  • 使用python和Django完成博客數(shù)據(jù)庫的遷移方法

    使用python和Django完成博客數(shù)據(jù)庫的遷移方法

    下面小編就為大家分享一篇使用python和Django完成博客數(shù)據(jù)庫的遷移方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • scrapy-splash簡單使用詳解

    scrapy-splash簡單使用詳解

    這篇文章主要介紹了scrapy-splash簡單使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python如何判斷字符串中是否包含特殊字符并替換

    Python如何判斷字符串中是否包含特殊字符并替換

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實現(xiàn)判斷字符串中是否包含特殊字符并使用空字符串替換掉,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-05-05
  • 基于Python開發(fā)Windows屏幕控制工具

    基于Python開發(fā)Windows屏幕控制工具

    在數(shù)字化辦公時代,屏幕管理已成為提升工作效率和保護(hù)眼睛健康的重要環(huán)節(jié),本文將分享一個基于Python和PySide6開發(fā)的Windows屏幕控制工具,感興趣的可以了解下
    2025-06-06

最新評論

湄潭县| 马关县| 巫山县| 沅江市| 和顺县| 永城市| 沛县| 尼木县| 新干县| 台南县| 唐山市| 京山县| 峨边| 洛南县| 环江| 桑植县| 南宁市| 岑溪市| 定边县| 思茅市| 淳化县| 简阳市| 扎囊县| 封开县| 呈贡县| 奎屯市| 澄迈县| 通许县| 上饶市| 华阴市| 汉阴县| 即墨市| 土默特右旗| 福安市| 太谷县| 沁水县| 和平县| 苏尼特左旗| 扎赉特旗| 横山县| 莲花县|