亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

淺談python多線程和多線程變量共享問題介紹

瀏覽:121日期:2022-07-29 16:11:28

1、demo

第一個代碼是多線程的簡單使用,編寫了線程如何執行函數和類。

import threadingimport timeclass ClassName(threading.Thread):'''創建類,通過多線程執行'''def run(self):for i in range(5):print(i)time.sleep(1)def sing():for i in range(1,11):print('唱歌第 %d 遍' % i)time.sleep(1)def dance():for i in range(1,16):print('跳舞第 %d 遍' % i)time.sleep(1)def main():t1 = threading.Thread(target = sing)t2 = threading.Thread(target = dance)t = ClassName()# 啟動線程t1.start()t2.start()t.start()while True:length = len(threading.enumerate())print('正在運行的線程有 %s' %threading.enumerate())if length <= 1:breaktime.sleep(1)if __name__ == ’__main__’:main()

執行結果可以看到函數 sing、dance和類在同時執行,執行效果太長就不方截圖了

2、多線程共享變量

通過定義全局變量,然后再test1函數類部進行更改全局變量,test2打印全局變量。

import threadingimport time#定義全局變量g_num = 0def test1():'''函數test1對全局變量進行更改'''global g_numfor i in range(1,10):g_num += 1print('--- test1 線程 g_num = %d--- ' % g_num)def test2():'''函數test2 打印全局變量'''print('--- test2 線程 g_num = %d--- ' % g_num)def main():t1 = threading.Thread(target=test1)t2 = threading.Thread(target=test2)# 啟動線程t1.start()# 增加睡眠是為了保證優先執行函數test1time.sleep(1)t2.start()print('--- 主線程 g_num = %d--- ' % g_num)if __name__ == ’__main__’:main()

執行結果可以看出,在主線程和創建的兩個線程中讀取的是一樣的值,既可以表明在多線程中變量共享

淺談python多線程和多線程變量共享問題介紹

3、資源競爭

在多線程兩個函數中同時更改一個變量時,由于cpu的計算能力,當修改參數的代碼塊無法一次性執行完成時,就會產生資源競爭

import threadingimport time# 定義全局變量g_num = 0def test1(num):'''函數test1對全局變量進行更改'''global g_numfor i in range(num):g_num += 1print('test1 線程 g_num = %d---' % g_num)def test2(num):'''函數test2對全局變量進行更改'''global g_numfor i in range(num):g_num += 1print('tes2 線程 g_num = %d---' % g_num)def main():t1 = threading.Thread(target=test1, args=(1000000, ))t2 = threading.Thread(target=test2, args=(1000000, ))t1.start()t2.start()time.sleep(1)print('主線程 g_num = %d---' % g_num)if __name__ == ’__main__’:main()

可以先試試傳遞參數為100時,可以看到g_num = 200 這是因為函數代碼可以一次性執行完成,當參數為1000000時代碼無法一次性執行完成,g_num!= 2000000

淺談python多線程和多線程變量共享問題介紹

4、互斥鎖

互斥鎖可以解決資源競爭的問題,原理很簡單,通過對代碼塊上鎖,保證該代碼執行完成前,其它代碼無法進行修改。執行完成后解鎖,其它代碼就可以執行了。

import threadingimport time# 創建變量g_num = 0# 創建鎖默認為開鎖狀態mutex = threading.Lock()def test1(num):global g_numfor i in range(num):# 上鎖mutex.acquire()g_num += 1# 解鎖mutex.release()print('--- test1 線程 g_num = %d---' % g_num)def test2(num):global g_numfor i in range(num):# 上鎖mutex.acquire()g_num += 1# 解鎖mutex.release()print('--- test2 線程 g_num = %d---' % g_num)def main():t1 = threading.Thread(target=test1, args=(1000000, ))t2 = threading.Thread(target=test2, args=(1000000, ))t1.start()t2.start()time.sleep(1)print('--- 主線程 g_num = %d---' % g_num)if __name__ == ’__main__’:main()

可以看到加了鎖之后,代碼執行不會出現資源競爭,結果也是正常的。互斥鎖,上鎖的代碼越少越好。

淺談python多線程和多線程變量共享問題介紹

5、死鎖

當出現多個鎖時,就可能會產生死鎖這個情況。當關閉一個鎖時,這個鎖已經為關閉狀態的話,程序就會阻塞。就如同下面這個代碼中。函數test1關閉mutexB鎖時,函數test2提前將其關閉了,未進行解鎖,程序就會一直阻塞。

import threadingimport time# 創建兩個鎖A, BmutexA = threading.Lock()mutexB = threading.Lock()def test1():# 對muctexA上鎖mutexA.acquire()# mutexA上鎖后,延時1秒,等待mutexB上鎖print('test1 ---do1---up---')time.sleep(1)# 此時會堵塞,因為mutexB已經上鎖mutexB.acquire()print('test1 ---do1---down---')mutexB.release()# 對mutexA解鎖mutexA.release()def test2():# 對muctexB上鎖mutexB.acquire()# mutexB上鎖后,延時1秒,等待mutexA上鎖print('test2 ---do1---up---')time.sleep(1)# 此時會堵塞,因為mutexB已經上鎖mutexA.acquire()print('test2 ---do1---down---')mutexA.release()# 對mutexA解鎖mutexB.release()def main():t1 = threading.Thread(target=test1)t2 = threading.Thread(target=test2)t1.start()t2.start()if __name__ == ’__main__’:main()

代碼執行效果可以看到程序會一直阻塞解決方法1、在程序編寫時,就需要注意避免死鎖2、可以參考銀行家算法

淺談python多線程和多線程變量共享問題介紹

到此這篇關于淺談python多線程和多線程變量共享問題介紹的文章就介紹到這了,更多相關python 多線程變量共享內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 欧日韩视频777888 | 九月婷婷开心九月 | 黑人干中国妞 | 国产视频自拍偷拍 | 日本特黄特黄刺激大片免费 | 国产精品麻豆网站 | 操日韩美女 | 黄色片1级| 亚洲精品午夜aaa级久久久久 | 欧美三级免费看 | 成人一级黄色大片 | 欧美精品国产一区二区三区 | 免费观看又色又爽又大高清网站 | 伊人婷婷色 | 国产精品久久久久免费a∨ 国产精品久久久久这里只有精品 | 一级成人a做片免费 | 国产一区二区在线视频播放 | 亚洲全网成人资源在线观看 | 免费啪视频观在线视频在线 | 免费黄色在线观看 | 一级一级一级一级毛片 | 国产精品99久久免费观看 | 国产在线91观看免费观看 | 国产美女一级高清免费观看 | 国产精品福利在线观看入口 | 欧美日韩一区二区在线视频播放 | 中文字幕最新 | 妖精视频在线观看18 | 国产高清视频在线播放www色 | 成年啪啪网站免费播放看 | 秘书高跟黑色丝袜国产91在线 | 欧美毛片在线播放观看 | 国产在线视频区 | 久久国产精品成人免费 | 黄色大片一级片 | 免费观看欧美性一级 | 国产精品久久做爰 | 看亚洲a级一级毛片 | 特级全毛片 | 久久国产精品免费专区 | 精品国产97在线观看 |