国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

淺談python多線程和多線程變量共享問(wèn)題介紹

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

1、demo

第一個(gè)代碼是多線程的簡(jiǎn)單使用,編寫(xiě)了線程如何執(zhí)行函數(shù)和類。

import threadingimport timeclass ClassName(threading.Thread):'''創(chuàng)建類,通過(guò)多線程執(zhí)行'''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()# 啟動(dòng)線程t1.start()t2.start()t.start()while True:length = len(threading.enumerate())print('正在運(yùn)行的線程有 %s' %threading.enumerate())if length <= 1:breaktime.sleep(1)if __name__ == ’__main__’:main()

執(zhí)行結(jié)果可以看到函數(shù) sing、dance和類在同時(shí)執(zhí)行,執(zhí)行效果太長(zhǎng)就不方截圖了

2、多線程共享變量

通過(guò)定義全局變量,然后再test1函數(shù)類部進(jìn)行更改全局變量,test2打印全局變量。

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

執(zhí)行結(jié)果可以看出,在主線程和創(chuàng)建的兩個(gè)線程中讀取的是一樣的值,既可以表明在多線程中變量共享

淺談python多線程和多線程變量共享問(wèn)題介紹

3、資源競(jìng)爭(zhēng)

在多線程兩個(gè)函數(shù)中同時(shí)更改一個(gè)變量時(shí),由于cpu的計(jì)算能力,當(dāng)修改參數(shù)的代碼塊無(wú)法一次性執(zhí)行完成時(shí),就會(huì)產(chǎn)生資源競(jìng)爭(zhēng)

import threadingimport time# 定義全局變量g_num = 0def test1(num):'''函數(shù)test1對(duì)全局變量進(jìn)行更改'''global g_numfor i in range(num):g_num += 1print('test1 線程 g_num = %d---' % g_num)def test2(num):'''函數(shù)test2對(duì)全局變量進(jìn)行更改'''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()

可以先試試傳遞參數(shù)為100時(shí),可以看到g_num = 200 這是因?yàn)楹瘮?shù)代碼可以一次性執(zhí)行完成,當(dāng)參數(shù)為1000000時(shí)代碼無(wú)法一次性執(zhí)行完成,g_num!= 2000000

淺談python多線程和多線程變量共享問(wèn)題介紹

4、互斥鎖

互斥鎖可以解決資源競(jìng)爭(zhēng)的問(wèn)題,原理很簡(jiǎn)單,通過(guò)對(duì)代碼塊上鎖,保證該代碼執(zhí)行完成前,其它代碼無(wú)法進(jìn)行修改。執(zhí)行完成后解鎖,其它代碼就可以執(zhí)行了。

import threadingimport time# 創(chuàng)建變量g_num = 0# 創(chuàng)建鎖默認(rèn)為開(kāi)鎖狀態(tài)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()

可以看到加了鎖之后,代碼執(zhí)行不會(huì)出現(xiàn)資源競(jìng)爭(zhēng),結(jié)果也是正常的。互斥鎖,上鎖的代碼越少越好。

淺談python多線程和多線程變量共享問(wèn)題介紹

5、死鎖

當(dāng)出現(xiàn)多個(gè)鎖時(shí),就可能會(huì)產(chǎn)生死鎖這個(gè)情況。當(dāng)關(guān)閉一個(gè)鎖時(shí),這個(gè)鎖已經(jīng)為關(guān)閉狀態(tài)的話,程序就會(huì)阻塞。就如同下面這個(gè)代碼中。函數(shù)test1關(guān)閉mutexB鎖時(shí),函數(shù)test2提前將其關(guān)閉了,未進(jìn)行解鎖,程序就會(huì)一直阻塞。

import threadingimport time# 創(chuàng)建兩個(gè)鎖A, BmutexA = threading.Lock()mutexB = threading.Lock()def test1():# 對(duì)muctexA上鎖mutexA.acquire()# mutexA上鎖后,延時(shí)1秒,等待mutexB上鎖print('test1 ---do1---up---')time.sleep(1)# 此時(shí)會(huì)堵塞,因?yàn)閙utexB已經(jīng)上鎖mutexB.acquire()print('test1 ---do1---down---')mutexB.release()# 對(duì)mutexA解鎖mutexA.release()def test2():# 對(duì)muctexB上鎖mutexB.acquire()# mutexB上鎖后,延時(shí)1秒,等待mutexA上鎖print('test2 ---do1---up---')time.sleep(1)# 此時(shí)會(huì)堵塞,因?yàn)閙utexB已經(jīng)上鎖mutexA.acquire()print('test2 ---do1---down---')mutexA.release()# 對(duì)mutexA解鎖mutexB.release()def main():t1 = threading.Thread(target=test1)t2 = threading.Thread(target=test2)t1.start()t2.start()if __name__ == ’__main__’:main()

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

淺談python多線程和多線程變量共享問(wèn)題介紹

到此這篇關(guān)于淺談python多線程和多線程變量共享問(wèn)題介紹的文章就介紹到這了,更多相關(guān)python 多線程變量共享內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 一区二区三区免费精品视频 | 国产午夜小视频 | 香蕉久久高清国产精品免费 | 久久久久久国产精品三级 | 欧美亚洲日本韩国一级毛片 | 成人爽a毛片在线视频网站 成人爽爽大片在线观看 | 日本色中色 | 精品亚洲福利一区二区 | 亚洲 欧美 激情 另类 校园 | 日韩精品久久久毛片一区二区 | 日产国产精品亚洲系列 | 欧美a大片 | 中国一级淫片aaa毛片毛片 | 国内精品自产拍在线观看91 | 亚洲一级免费视频 | 久久成人18| 99久久精品自在自看国产 | 日产一区两区三区 | 俄罗斯一级黄色片 | 亚洲欧美一区二区三区久久 | 91在线亚洲 | 久久国产亚洲观看 | 国内精品久久久久久影院老狼 | 欧美特欧美特级一片 | 男女交性拍拍拍高清视频 | 怡红院免费va男人的天堂 | 国产成人午夜福在线观看 | 天堂中文字幕 | 台湾三级香港三级在线理论 | 99国产高清久久久久久网站 | 成人18免费网站 | 亚洲视频在线观看网站 | 日本久久网| 久草资源在线播放 | 久久狠狠色狠狠色综合 | 亚洲视频中文字幕在线观看 | 精品国产91久久久久久久a | 欧美日韩在线视频免费完整 | 色吊丝avav色吊丝 | 97国产在线视频公开免费 | 亚洲一级毛片视频 |