日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Python系列:多線程(threading)的學習和使用

來源: 責編: 時間:2024-01-15 17:11:10 251觀看
導讀哈嘍大家好,我是了不起,今天來給大家介紹關于Python中的線程,threading庫。引言在Python中,threading庫提供了一種簡單且方便的方式來實現多線程編程。通過使用線程,可以在程序中并行執行多個任務,提高程序的性能和響應性。

哈嘍大家好,我是了不起,今天來給大家介紹關于Python中的線程,threading庫。v9L28資訊網——每日最新資訊28at.com

引言

在Python中,threading庫提供了一種簡單且方便的方式來實現多線程編程。通過使用線程,可以在程序中并行執行多個任務,提高程序的性能和響應性。v9L28資訊網——每日最新資訊28at.com

v9L28資訊網——每日最新資訊28at.com

了解線程

線程是程序執行的最小單元,是操作系統能夠進行運算調度的基本單位。與進程不同,線程在同一進程下共享相同的內存空間,因此線程之間的通信更加方便。在Python中,threading庫提供了對線程的支持。v9L28資訊網——每日最新資訊28at.com

創建線程

threading庫是Python中的標準庫,無需下載,我們只需在文件中導入threading庫就可以用了。v9L28資訊網——每日最新資訊28at.com

創建線程的時候主要有兩種方式,第一種是通過繼承threading.Thread類,第二種則是通過傳遞可調用對象給threading.Thread的構造函數,接下來先講解第一種方式。v9L28資訊網——每日最新資訊28at.com

1.通過繼承threading.Thread類創建線程

import threadingclass MyThread(threading.Thread):    def __init__(self, name):        super(MyThread, self).__init__()        self.name = name    def run(self):        print(f"Thread {self.name} is running.")# 創建線程的實例thread1 = MyThread(name="Thread 1")thread2 = MyThread(name="Thread 2")# 啟動線程thread1.start()thread2.start()# 等待線程執行完畢thread1.join()thread2.join()print("Main thread is done.")

第一種方式是最常見的方式,創建線程的時候需要先創建一個類,然后繼承threading.Thread,然后再我們創建的類中自定義一個方法,這里我構造的是run方法,在這個方法中我們可以去實現線程需要執行的主要邏輯。v9L28資訊網——每日最新資訊28at.com

然后通過thread1和thread2創建對應的構造實例,使用線程中的start()方法去啟動線程,最后在使用join()等到線程執行完畢,這樣我們創建了一個基本的多線程,執行后結果如下:v9L28資訊網——每日最新資訊28at.com

v9L28資訊網——每日最新資訊28at.com

然后我們再來了解第二種創建線程的方式。v9L28資訊網——每日最新資訊28at.com

2.通過傳遞可調用對象創建線程

import threadingdef my_function(name):    print(f"Thread {name} is running.")# 創建線程的實例,傳遞一個可調用對象和參數thread1 = threading.Thread(target=my_function, args=("Thread 1",))thread2 = threading.Thread(target=my_function, args=("Thread 2",))# 啟動線程thread1.start()thread2.start()# 等待線程執行完畢thread1.join()thread2.join()print("Main thread is done.")

這種方式我們是直接通過傳遞給一個可調用對象給threading.Thread的構造函數,我們所傳遞的這個可執行對象可以是函數、方法、或者是__call__等方法類的實例,v9L28資訊網——每日最新資訊28at.com

其中在threading.Thread實例中,通過使用target參數指定我們需要調用的對象,注意這里指定調用對象是不需要加括號,直接傳需要調用的可執行對象名就行,后面就和上面一樣,通過使用start()方法和join()方法,執行結果也是跟第一種方式一樣。v9L28資訊網——每日最新資訊28at.com

v9L28資訊網——每日最新資訊28at.com

以上兩種方式都可以創建線程,選擇那種一般取決于個人在項目中的代碼風格和偏好,但是最終都是需要確保的是,無論使用哪種方式我們都需要保證在調用的方法中包含有線程的主要邏輯。v9L28資訊網——每日最新資訊28at.com

線程同步

Python中的線程和其他語言中的線程邏輯也是一樣,如果創建了多個線程,那么這幾個線程就是共享內存,可能會導致數據競爭和不確定的結果,所以我們需要在線程中加鎖(lock)。v9L28資訊網——每日最新資訊28at.com

1.鎖的基本用法

在python中,如果需要對線程加鎖我們就需要用到threading.lock()這個方法:v9L28資訊網——每日最新資訊28at.com

import threading# 共享資源counter = 0# 創建鎖對象my_lock = threading.Lock()def increment_counter():    global counter    for _ in range(1000000):        with my_lock:            counter += 1# 創建兩個線程,分別增加計數器的值thread1 = threading.Thread(target=increment_counter)thread2 = threading.Thread(target=increment_counter)# 啟動線程thread1.start()thread2.start()# 等待兩個線程執行完畢thread1.join()thread2.join()print(f"Final counter value: {counter}")

在上述代碼中,我們通過創建了一個全局鎖對象,然后在調用的可執行對象中,使用with語句來獲取鎖和釋放鎖,以此來確保線程共享的資源是原子的。這樣可以避免多個線程對counter的參數結果進行數據競爭。v9L28資訊網——每日最新資訊28at.com

從這個簡單的代碼上我們可能看不出執行后實際有什么不同,接下來我舉一個例子來說明沒有加鎖和加了鎖后的執行結果。v9L28資訊網——每日最新資訊28at.com

2.不加鎖執行

import threadingclass BankAccount:    def __init__(self, balance):        self.balance = balance    def withdraw(self, amount):        current_balance = self.balance        new_balance = current_balance - amount        # 模擬取款操作的延遲        threading.Event().wait(0.1)        self.balance = new_balance        return new_balance# 創建一個共享的銀行賬戶account = BankAccount(balance=1000)def withdraw_from_account(account, amount):    for _ in range(3):        new_balance = account.withdraw(amount)        print(f"Withdraw {amount}, New Balance: {new_balance}")# 創建兩個線程進行取款操作thread1 = threading.Thread(target=withdraw_from_account, args=(account, 100))thread2 = threading.Thread(target=withdraw_from_account, args=(account, 150))# 啟動兩個線程thread1.start()thread2.start()# 等待兩個線程執行完畢thread1.join()thread2.join()print(f"Final Balance: {account.balance}")

執行結果:v9L28資訊網——每日最新資訊28at.com

v9L28資訊網——每日最新資訊28at.com

在上面這個不加鎖的實例中,我們用withdraw方法來模擬取款操作,然后通過兩個線程來對同時對賬戶進行取款操作,但是由于這個實例中沒有加鎖,就會出現下面的情況:v9L28資訊網——每日最新資訊28at.com

  • thread1讀取了賬戶余額(假設為1000)。
  • thread2也讀取了相同的賬戶余額(仍然是1000)。
  • thread1執行取款操作,更新了賬戶余額為900。
  • thread2執行取款操作,更新了賬戶余額為850。

就這樣,本來是同一個賬戶,但是兩個線程都是各管各的,最后導致兩個線程都取了3次錢后,最后得出的結果是賬戶里面還剩了550元。v9L28資訊網——每日最新資訊28at.com

接下來我們再看看加鎖后的執行結果:v9L28資訊網——每日最新資訊28at.com

import threadingclass BankAccount:    def __init__(self, balance):        self.balance = balance        self.lock = threading.Lock()    def withdraw(self, amount):        with self.lock:            current_balance = self.balance            new_balance = current_balance - amount            # 模擬取款操作的延遲            threading.Event().wait(0.1)            self.balance = new_balance            return new_balance# 創建一個共享的銀行賬戶account = BankAccount(balance=1000)def withdraw_from_account(account, amount):    for _ in range(3):        new_balance = account.withdraw(amount)        print(f"Withdraw {amount}, New Balance: {new_balance}")# 創建兩個線程進行取款操作thread1 = threading.Thread(target=withdraw_from_account, args=(account, 100))thread2 = threading.Thread(target=withdraw_from_account, args=(account, 150))# 啟動兩個線程thread1.start()thread2.start()# 等待兩個線程執行完畢thread1.join()thread2.join()print(f"Final Balance: {account.balance}")

同樣的實例,我們通過在實例中加鎖后再去執行,結果如下:v9L28資訊網——每日最新資訊28at.com

v9L28資訊網——每日最新資訊28at.com

通過在實例中添加with self.lock后,我們保證了兩個線程訪問余額blance的原子性,不管是有多少個線程,每個線程訪問的余額始終是其他線程取錢后的最新結果,這樣就保證了代碼程序執行后的結果是正確的。v9L28資訊網——每日最新資訊28at.com

以上是今天分享的關于Python中一些基本的線程使用,有興趣的小伙伴想要深入學習threading這個模塊的話可以在留言區打出threading,人多的話我下期就繼續更新這個模塊。v9L28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-61905-0.htmlPython系列:多線程(threading)的學習和使用

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 高可靠的跨系統轉賬如何設計

下一篇: REST API的藝術:初學者穿越API空間的旅程與速查表!

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美大片第1页| 久久久精品国产免大香伊| 日韩一区二区电影网| 一区二区电影免费在线观看| 午夜亚洲伦理| 美女视频黄 久久| 欧美日韩免费区域视频在线观看| 国产精品毛片一区二区三区| 国内精品嫩模av私拍在线观看 | 国产一区二区三区久久精品| 在线精品国产欧美| 亚洲免费福利视频| 欧美亚洲三级| 欧美国产第一页| 国产精品一区二区久久精品| 亚洲第一在线综合网站| 亚洲精品黄网在线观看| 香蕉国产精品偷在线观看不卡| 久久久久久久成人| 欧美日韩视频在线一区二区| 国产字幕视频一区二区| 日韩视频三区| 久久精品首页| 欧美三级视频在线| 亚洲国产aⅴ天堂久久| 亚洲一区欧美| 欧美大片一区| 国产在线不卡精品| 一区二区三区欧美成人| 久久亚洲国产精品一区二区| 国产精品久久久久久久久免费| 亚洲国产精品久久| 欧美在线看片| 国产精品啊啊啊| 亚洲欧洲日本国产| 久久精品一本| 国产精品高清网站| 亚洲欧洲日产国产综合网| 久久爱另类一区二区小说| 欧美日韩精品| 亚洲高清在线| 久久久999精品免费| 国产精品久久久久久av下载红粉| 亚洲国产另类精品专区| 久久久精品五月天| 国产精品自拍网站| 亚洲一区二区三区精品在线| 欧美护士18xxxxhd| 在线观看欧美黄色| 欧美专区第一页| 国产精品久久久久国产精品日日| 亚洲毛片在线观看.| 久热成人在线视频| 国产一区二区三区四区| 亚洲欧美第一页| 欧美三日本三级三级在线播放| 亚洲人精品午夜在线观看| 久久中文在线| 狠狠色香婷婷久久亚洲精品| 欧美在线观看天堂一区二区三区| 国产精品网站在线| 亚洲午夜激情网页| 欧美日韩在线高清| 99国产精品视频免费观看一公开| 欧美jjzz| 91久久国产综合久久蜜月精品 | 亚洲欧美视频在线观看视频| 欧美日韩人人澡狠狠躁视频| 亚洲精品国产精品乱码不99| 免费欧美在线| 亚洲第一狼人社区| 久久影院午夜论| 精品99视频| 久热精品视频在线观看| 一区二区三区中文在线观看| 久久精品99国产精品| 国产视频久久网| 久久9热精品视频| 国产一区二区三区四区在线观看 | 国产欧美日韩精品a在线观看| 亚洲影视综合| 国产精品亚洲综合| 性亚洲最疯狂xxxx高清| 国产欧美一区二区精品婷婷| 欧美一区二区三区婷婷月色 | 欧美日韩一区二区在线播放| 宅男精品视频| 国产精品久久久久久影院8一贰佰| 亚洲女ⅴideoshd黑人| 国产精品视频免费观看www| 亚洲欧美日本日韩| 国产日韩欧美精品在线| 久久精品99国产精品| 激情小说亚洲一区| 欧美gay视频激情| av成人免费在线| 国产精品久久久久7777婷婷| 西西人体一区二区| 韩国三级在线一区| 欧美gay视频激情| av成人免费在线观看| 国产精品视频yy9299一区| 久久av最新网址| 亚洲第一网站| 欧美日韩三级一区二区| 亚洲欧美日韩国产另类专区| 国产精品视频久久一区| aⅴ色国产欧美| 欧美日韩亚洲一区二区三区在线| 一区二区三区偷拍| 国产精品一区2区| 久久精品国产欧美激情| 亚洲高清色综合| 欧美日韩免费高清| 午夜精品福利一区二区三区av | 欧美国产日产韩国视频| 一区二区三区 在线观看视频| 国产精品一卡| 免费久久精品视频| 亚洲视频观看| 国产资源精品在线观看| 欧美黄色一区二区| 亚洲欧美精品在线| 在线免费观看视频一区| 欧美视频免费看| 久久久久久国产精品mv| 亚洲毛片在线观看.| 国产欧美日韩亚州综合| 欧美成人午夜激情在线| 亚洲一区在线看| 一区国产精品| 欧美午夜剧场| 欧美性猛交视频| 亚洲午夜久久久| 狠狠色综合网站久久久久久久| 欧美电影免费观看网站| 亚洲一区二区毛片| 一色屋精品视频在线观看网站| 欧美日韩久久久久久| 久久不见久久见免费视频1| 亚洲人成小说网站色在线| 国产精品色婷婷| 欧美国产先锋| 久久不射电影网| 亚洲色图在线视频| 在线国产日韩| 国产精品入口麻豆原神| 欧美高清视频| 久久久久欧美| 亚洲欧美日韩在线观看a三区| 亚洲高清在线| 国产亚洲一区二区三区在线播放| 欧美日韩系列| 欧美v亚洲v综合ⅴ国产v| 国产精品网站在线观看| 欧美**人妖| 久久精品免费| 亚洲免费视频中文字幕| 亚洲三级视频| 在线看日韩av| 国产亚洲欧美另类一区二区三区| 欧美视频精品在线| 嫩草成人www欧美| 久久国产精品亚洲77777| 亚洲天堂网在线观看| 亚洲人精品午夜| 在线看片日韩| 国内精品一区二区| 国产精品视频一区二区三区| 欧美日韩视频免费播放| 欧美经典一区二区三区| 久热成人在线视频| 久久精品一区二区| 午夜精品视频网站| 亚洲一线二线三线久久久| 一区二区欧美国产| 亚洲美女av电影| 91久久精品国产91久久性色tv | 伊人久久亚洲热| 国产日韩高清一区二区三区在线| 国产精品va| 欧美性猛交xxxx乱大交蜜桃| 欧美精品一区二区高清在线观看| 免费成人高清| 久久综合99re88久久爱| 久久亚洲精品中文字幕冲田杏梨 | 免费91麻豆精品国产自产在线观看| 久久成人精品无人区| 午夜在线精品偷拍| 欧美夜福利tv在线| 亚洲欧美精品suv| 亚洲男人第一av网站| 亚洲欧美成人一区二区在线电影| 亚洲无线视频| 亚洲一区二区在线看| 亚洲一区在线直播| 亚洲欧美日韩精品久久久| 亚洲欧美精品在线观看| 亚洲欧美日韩一区| 校园激情久久| 久久精品国产999大香线蕉| 久久精品视频免费观看| 久久视频国产精品免费视频在线| 久久久久久一区|