Python中線程同步的實(shí)現(xiàn)
多線程
案例
說(shuō)明:
- 唱歌方法
sing()
- 跳舞方法
dance()
- 啟用兩個(gè)線程調(diào)用
- 主線程結(jié)束
代碼
# 導(dǎo)入線程模塊 import threading import time def sing(name,age): time.sleep(2) print('唱歌者姓名:' + name + ',年齡:' + str(age)) print('正在唱歌...') def dance(name, age): time.sleep(2) print('跳舞者姓名:' + name + ',年齡:' + str(age)) print('正在跳舞...') if __name__ == '__main__': # args 元組傳參 t1 = threading.Thread(target=sing,args=('Alice', 18)) # kwargs 對(duì)象傳參 t2 = threading.Thread(target=dance,kwargs={'name': 'Bob', 'age': 18}) t1.start() t2.start() print("主線程結(jié)束")
- 運(yùn)行
問(wèn)題現(xiàn)象
- 輸出的結(jié)果和代碼的執(zhí)行順序不一致
- 最后的主線程輸出竟然最先輸出
- 線程的執(zhí)行是異步的并非同步
- 那么如何讓線程同步執(zhí)行呢?請(qǐng)看下一章節(jié) 《解決辦法》
解決辦法
線程同步
- 線程等待
- 互斥鎖
線程等待
調(diào)用線程的等待方法: join()
- 代碼
# 導(dǎo)入線程模塊 from threading import Thread import time def sing(name,age): time.sleep(2) print('唱歌者姓名:' + name + ',年齡:' + str(age)) print('正在唱歌...') def dance(name, age): time.sleep(2) print('跳舞者姓名:' + name + ',年齡:' + str(age)) print('正在跳舞...') if __name__ == '__main__': # args 元組傳參 t1 = Thread(target=sing,args=('Alice', 18)) # kwargs 對(duì)象傳參 t2 = Thread(target=dance,kwargs={'name': 'Bob', 'age': 18}) t1.start() t1.join() t2.start() t2.join() print("主線程結(jié)束")
- 運(yùn)行
互斥鎖
步驟:
- 導(dǎo)入鎖模塊:
from threading import Lock
- 實(shí)例化鎖:
lock = Lock()
- 獲取鎖:
lock.acquire()
- 釋放鎖:
lock.release()
代碼
# 導(dǎo)入線程模塊 from threading import Thread, Lock import time def sing(name, age): # 獲取鎖,用于線程同步 lock.acquire() time.sleep(2) print('唱歌者姓名:' + name + ',年齡:' + str(age)) print('正在唱歌...') # 釋放鎖,開(kāi)啟下一個(gè)線程 lock.release() def dance(name, age): # 獲取鎖,用于線程同步 lock.acquire() time.sleep(2) print('跳舞者姓名:' + name + ',年齡:' + str(age)) print('正在跳舞...') # 釋放鎖,開(kāi)啟下一個(gè)線程 lock.release() # 創(chuàng)建一個(gè)鎖 lock = Lock() if __name__ == '__main__': # args 元組傳參 t1 = Thread(target=sing, args=('Alice', 18)) # kwargs 對(duì)象傳參 t2 = Thread(target=dance, kwargs={'name': 'Bob', 'age': 18}) t1.start() # t1.join() t2.start() # t2.join() # print("主線程結(jié)束")
運(yùn)行
到此這篇關(guān)于Python中線程同步的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python 線程同步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 用turtle實(shí)現(xiàn)用正方形畫(huà)圓的例子
今天小編就為大家分享一篇Python 用turtle實(shí)現(xiàn)用正方形畫(huà)圓的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Python列表list解析操作示例【整數(shù)操作、字符操作、矩陣操作】
這篇文章主要介紹了Python列表list解析操作,結(jié)合實(shí)例形式分析了Python列表針對(duì)整數(shù)、字符及矩陣的解析操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07Python異步爬蟲(chóng)實(shí)現(xiàn)原理與知識(shí)總結(jié)
之前有很多小伙伴想看Python異步爬蟲(chóng)的有關(guān)知識(shí)總結(jié),這次它來(lái)了,文中有非常詳細(xì)的代碼示例與注釋,即使對(duì)剛開(kāi)始學(xué)python的小伙伴也很友好,,需要的朋友可以參考下2021-05-05使用Python3 poplib模塊刪除服務(wù)器多天前的郵件實(shí)現(xiàn)代碼
這篇文章主要介紹了使用Python3 poplib模塊刪除多天前的郵件的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04最好的Python DateTime 庫(kù)之 Pendulum 長(zhǎng)篇解析
datetime 模塊是 Python 中最重要的內(nèi)置模塊之一,它為實(shí)際編程問(wèn)題提供許多開(kāi)箱即用的解決方案,非常靈活和強(qiáng)大。例如,timedelta 是我最喜歡的工具之一2021-11-11pyhton列表轉(zhuǎn)換為數(shù)組的實(shí)例
下面小編就為大家分享一篇pyhton列表轉(zhuǎn)換為數(shù)組的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04python實(shí)現(xiàn)的文件同步服務(wù)器實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)的文件同步服務(wù)器,實(shí)例分析了文件同步服務(wù)器的原理及客戶端、服務(wù)端的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-06-06Python?OpenCV實(shí)現(xiàn)圖像傅里葉變換
傅里葉變換,也稱作傅立葉變換,表示能將滿足一定條件的某個(gè)函數(shù)表示成三角函數(shù)(正弦和/或余弦函數(shù))或者它們的積分的線性組合。本文將介紹如何通過(guò)OpenCV實(shí)現(xiàn)圖像的傅里葉變換,需要的可以參考一下2022-01-01