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

Python 基于線程的并行 threading模塊的用法

 更新時間:2025年06月12日 11:13:07   作者:V1ncent-CC  
threading模塊是Python的高級線程接口,提供線程對象和同步工具,本文主要介紹了Python 基于線程的并行 threading模塊的用法,感興趣的可以了解一下

threading模塊是基于_thread模塊的高級線程接口,相比于低層的_thread模塊,它提供了代表線程的對象和同步化工具,在threading模塊中,只要任何一個派生線程(守護線程除外)在運行中,程序都不會退出,不再需要像_thread那樣控制主線程等待。

一、threading模塊基本用法

threading模塊基于_thread進行了類封裝,其用于構(gòu)造線程的類為threading.Thread,通過創(chuàng)建類實例的方式來創(chuàng)建線程對象。

1.1 threading.Thread類

threading.Thread類的主要參數(shù)如下:

class threading.Thread(target=None, name=None, args=(), kwargs={}, *, daemon=None)

參數(shù)解釋:

  • target,用于定義子線程的活動,這應該是個可調(diào)用的函數(shù)。
  • name,線程的名稱。
  • args,可調(diào)用函數(shù)的參數(shù)。
  • kwargs,可調(diào)用函數(shù)的關(guān)鍵字參數(shù)。
  • daemon,是否將線程設(shè)置為守護線程。

通過調(diào)用threading.Thread類創(chuàng)建出來的實例即是線程對象,線程對象創(chuàng)建后,需要調(diào)用.start方法啟動,這個方法會在獨立的線程中喚起run方法,因此有2種方法可以定義子線程的活動:

  • 向構(gòu)造類threading.Thread傳遞一個可調(diào)用對象(target參數(shù))。
  • 通過子類重載run方法。

下面通過案例演示2種用法。

1.2 用法1:通過threading.Thread定義子線程活動

下面代碼先定義一個函數(shù)func,隨后調(diào)用threading.Thread創(chuàng)建2個線程對象,調(diào)用時通過target=func傳遞自定義函數(shù)(線程活動),最后通過線程對象的.start方法啟動線程:

import threading

def func(id):
    print('我是 {} 號子線程'.format(id))

t1 = threading.Thread(target=func, args=(1,))
t2 = threading.Thread(target=func, args=(2,))

t1.start()
t2.start()

在這里插入圖片描述

1.3 用法2:通過子類重載run方法定義子線程活動

還是上面的例子,這次通過重載子類的run方法來定義子線程活動,當調(diào)用線程對象的.start方法啟動子線程時,子線程會自動調(diào)用.run方法。

import threading

def func(id):
    print('我是 {} 號子線程'.format(id))

# 創(chuàng)建子類MyThread, threading.Thread為其超類
class MyThread(threading.Thread):
    def __init__(self, id):
        self.id = id
        threading.Thread.__init__(self)
    
    # 重載run方法
    def run(self):
        print('我是 {} 號子線程'.format(self.id))

t1 = MyThread(1)
t2 = MyThread(2)

# 啟動子線程,會調(diào)用子類中的run方法
t1.start()
t2.start()

在這里插入圖片描述

二、threading模塊其他方法

threading模塊相對_thread模塊額外提供了一些線程狀態(tài)查詢和控制工具,下面介紹幾個主要方法。

2.1 共享訪問控制 - threading.Lock

多線程必然會涉及到共享資源的訪問,threading模塊提供了一個.Lock方法(和_thread.allocate_lock是同一個東西)用于創(chuàng)建鎖對象,通過鎖來控制共享資源的訪問,基于上面的類MyThread同時創(chuàng)建10個子線程:

for i in range(10):
    MyThread(i).start()

在這里插入圖片描述

可以看到上面的輸出出現(xiàn)了重疊,這是因為這10個子線程共享一個標準輸出流,可能出現(xiàn)同時打印的情況。下面把MyThread類改造一下,通過.Lock對象來同步子線程的打印操作(每次打印前先獲取鎖,防止出現(xiàn)2個子線程同時打?。?/p>

class MyThread(threading.Thread):
    # 新增一個參數(shù)mutex,用于傳入鎖
    def __init__(self, id, mutex):
        self.id = id
        self.mutex = mutex
        threading.Thread.__init__(self)
    
    # 重載run方法
    def run(self):
        # 通過with語句管理鎖,打印前先獲取鎖,打印完成釋放
        with self.mutex:
            print('我是 {} 號子線程'.format(self.id))

# 創(chuàng)建一個鎖對象
mutex = threading.Lock()

for i in range(10):
    # 每個子線程啟動時都傳入該鎖
    MyThread(i, mutex).start()

在這里插入圖片描述

  • mutex = threading.Lock() 創(chuàng)建了一個鎖對象,并在創(chuàng)建子線程時傳入(這10個子線程傳入的是同一把鎖)。
  • 子類的run方法,在執(zhí)行print語句前新增了with self.mutex,這會嘗試獲取鎖,如果當前鎖被其他子線程占用(正在打?。敲此鼤却?。
  • 鎖對象也可以通過.acuqure和.release方法手動獲取和釋放,但建議還是使用with來管理(方便)。

2.2 阻塞方法 - threading.Thread.join

每個線程對象都有一個join方法,這個方法會阻塞調(diào)用者,直到線程終結(jié),這對于主線程來說是一個信號,通過join方法可以用來監(jiān)控子線程的完成情況,適合執(zhí)行在子線程完成后再執(zhí)行的動作。

下面改造一下子類的run方法,讓每個線程打印前隨機等待1-5秒,然后調(diào)用Thread.join方法,這個方法會阻塞主線程(等待子線程完成),當所有子線程執(zhí)行完畢時(.join方法返回),立刻打印"所有子線程執(zhí)行完畢"。

下面代碼在run方法的print之前加入了time.sleep(random.randint(1,5))讓子線程隨機睡眠1-5秒,因此子線程的結(jié)束時間是不確定的:

import time, random
class MyThread(threading.Thread):
    # 新增一個參數(shù)mutex,用于傳入鎖
    def __init__(self, id):
        self.id = id
        threading.Thread.__init__(self)
    
    # 重載run方法
    def run(self):
            # 打印之前隨機睡眠1-5秒
            time.sleep(random.randint(1,5))
            print('我是 {} 號子線程'.format(self.id))

threads = []

for i in range(10):
    # 每個子線程啟動時都傳入該鎖
    ti = MyThread(i)
    threads.append(ti)
    ti.start()

print("開始等待子線程執(zhí)行...")    
for thread in threads:
    # 針對每個子線程都會調(diào)用.join方法,所有子線程結(jié)束后,才會繼續(xù)向下執(zhí)行
    thread.join()
print("所有子線程執(zhí)行完畢...")    

在這里插入圖片描述

可以看到通過Thread.join方法阻塞主線程,可以保證在所有子線程都執(zhí)行完畢后,才打印"所有子線程執(zhí)行完畢…"。

以上即是threading模塊的基本用法,子線程還有.is_alive方法用來檢測是否存活,另外還有遞歸鎖可以用來嵌套獲取鎖,有興趣的同學可以深入研究一下。

最后:由于Cpython的中存在"全局解釋器鎖(GIL)",這個會限制利用多核CPU的計算資源(Python4.0可能會修復),因此多線程比較適合I/O密集型任務(wù),對于CPU密集型任務(wù),推薦還是使用多進程并發(fā)(multiprocessing模塊)。

到此這篇關(guān)于Python 基于線程的并行 threading模塊的用法的文章就介紹到這了,更多相關(guān)Python 線程并行threading用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pytorch執(zhí)行報錯cuda版本不匹配

    pytorch執(zhí)行報錯cuda版本不匹配

    本文主要介紹了pytorch執(zhí)行報錯cuda版本不匹配,可能包括CUDA驅(qū)動程序、CUDA工具包、PyTorch版本、GPU占用、硬件問題等,并提供了檢查和解決方法,感興趣的可以了解一下
    2026-04-04
  • Python使用requests庫發(fā)送請求的示例代碼

    Python使用requests庫發(fā)送請求的示例代碼

    與原生的urllib庫相比,requests庫提供了更簡潔、易于理解和使用的API,使發(fā)送HTTP請求變得更加直觀和高效,所以本文給大家介紹了Python如何使用requests庫發(fā)送請求,需要的朋友可以參考下
    2024-03-03
  • pandas增加列的七種方法總結(jié)

    pandas增加列的七種方法總結(jié)

    這篇文章主要為大家詳細介紹了python中pandas增加列的七種常用方法,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以參考一下
    2023-11-11
  • Python實現(xiàn)雞群算法的示例代碼

    Python實現(xiàn)雞群算法的示例代碼

    雞群算法,縮寫為CSO(Chicken?Swarm?Optimization),盡管具備所謂仿生學的背景,但實質(zhì)上是粒子群算法的一個變體。本文將利用Python語言實現(xiàn)這一算法,感興趣的可以了解一下
    2022-11-11
  • python?yield迭代器詳解

    python?yield迭代器詳解

    帶有yield的函數(shù)在Python中被稱之為generator(生成器),也就是說,當你調(diào)用這個函數(shù)的時候,函數(shù)內(nèi)部的代碼并不立即執(zhí)行?,這個函數(shù)只是返回一個生成器
    2022-11-11
  • Python實現(xiàn)Excel數(shù)據(jù)自動化處理的全過程

    Python實現(xiàn)Excel數(shù)據(jù)自動化處理的全過程

    本文介紹了Python處理Excel數(shù)據(jù)的優(yōu)勢、環(huán)境準備、核心操作實現(xiàn)、實戰(zhàn)案例、性能優(yōu)化技巧以及常見問題,通過Python自動化工具,可以顯著提高數(shù)據(jù)處理效率,減少錯誤率,并使數(shù)據(jù)處理成為可積累、可優(yōu)化的智能流程,需要的朋友可以參考下
    2025-12-12
  • Python實現(xiàn)QR碼的代碼詳解

    Python實現(xiàn)QR碼的代碼詳解

    這篇博客將分為五個部分,詳細介紹QR碼的生成原理、底層實現(xiàn),并使用Python代碼實現(xiàn),采用面向?qū)ο蟮木幊趟悸?使用合適的設(shè)計模式進行案例展示,每個案例將包含完整代碼和詳細解釋,需要的朋友可以參考下
    2024-11-11
  • python 基于TCP協(xié)議的套接字編程詳解

    python 基于TCP協(xié)議的套接字編程詳解

    這篇文章主要介紹了python 基于TCP協(xié)議的套接字編程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-06-06
  • Pycharm2020.1安裝無法啟動問題即設(shè)置中文插件的方法

    Pycharm2020.1安裝無法啟動問題即設(shè)置中文插件的方法

    這篇文章主要介紹了Pycharm2020.1安裝無法啟動問題即設(shè)置中文插件的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-08-08
  • Python生成圖文并茂的PDF報告的方法詳解

    Python生成圖文并茂的PDF報告的方法詳解

    reportlab是Python的一個標準庫,可以畫圖、畫表格、編輯文字,最后可以輸出PDF格式。本文將利用reportlab模塊生成圖文并茂的PDF報告,感興趣的可以了解一下
    2022-06-06

最新評論

新巴尔虎左旗| 文山县| 嘉黎县| 万年县| 沙雅县| 林周县| 双柏县| 德惠市| 交口县| 陕西省| 黎川县| 汤阴县| 瓦房店市| 鄂托克前旗| 获嘉县| 邢台县| 丘北县| 海阳市| 合水县| 潢川县| 蓝田县| 绍兴市| 勐海县| 偏关县| 禹州市| 泸西县| 望都县| 青浦区| 平乐县| 普定县| 木里| 雷州市| 云阳县| 临潭县| 柳林县| 辽中县| 滕州市| 郓城县| 招远市| 泰州市| 会昌县|