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

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

Python 多線程共享變量的實(shí)現(xiàn)示例

瀏覽:70日期:2022-07-29 16:10:21

多線程-共享全局變量

#coding=utf-8from threading import Threadimport timeg_num = 100def work1(): global g_num for i in range(3): g_num += 1 print('----in work1, g_num is %d---'%g_num)def work2(): global g_num print('----in work2, g_num is %d---'%g_num)print('---線程創(chuàng)建之前g_num is %d---'%g_num)t1 = Thread(target=work1)t1.start()#延時(shí)一會(huì),保證t1線程中的事情做完time.sleep(1)t2 = Thread(target=work2)t2.start()

執(zhí)行如下:

[root@server01 many_task]# python test5.py ---線程創(chuàng)建之前g_num is 100-------in work1, g_num is 103-------in work2, g_num is 103---[root@server01 many_task]#

從上面兩個(gè)線程執(zhí)行的結(jié)果來(lái)看,線程t1將 g_num 加到 103,在線程t2也是打印g_num=103。所以對(duì)于兩個(gè)線程,g_num這個(gè)全局變量是共享的。

列表當(dāng)做實(shí)參傳遞到線程中

#coding=utf-8from threading import Threadimport timedef work1(nums): nums.append(44) print('----in work1---',nums)def work2(nums): #延時(shí)一會(huì),保證t1線程中的事情做完 time.sleep(1) print('----in work2---',nums)g_nums = [11,22,33]t1 = Thread(target=work1, args=(g_nums,))t1.start()t2 = Thread(target=work2, args=(g_nums,))t2.start()

運(yùn)行如下:

[root@server01 many_task]# python test6.py (’----in work1---’, [11, 22, 33, 44])(’----in work2---’, [11, 22, 33, 44])

總結(jié):在一個(gè)進(jìn)程內(nèi)的所有線程共享全局變量,很方便在多個(gè)線程間共享數(shù)據(jù)缺點(diǎn)就是,線程是對(duì)全局變量隨意遂改可能造成多線程之間對(duì)全局變量的混亂(即線程非安全)

多線程-共享全局變量問(wèn)題

多線程開發(fā)可能遇到的問(wèn)題

假設(shè)兩個(gè)線程t1和t2都要對(duì)全局變量g_num(默認(rèn)是0)進(jìn)行加1運(yùn)算,t1和t2都各對(duì)g_num加10次,g_num的最終的結(jié)果應(yīng)該為20。

但是由于是多線程同時(shí)操作,有可能出現(xiàn)下面情況:

在g_num=0時(shí),t1取得g_num=0。此時(shí)系統(tǒng)把t1調(diào)度為”sleeping”狀態(tài),把t2轉(zhuǎn)換為”running”狀態(tài),t2也獲得g_num=0然后t2對(duì)得到的值進(jìn)行加1并賦給g_num,使得g_num=1然后系統(tǒng)又把t2調(diào)度為”sleeping”,把t1轉(zhuǎn)為”running”。線程t1又把它之前得到的0加1后賦值給g_num。這樣導(dǎo)致雖然t1和t2都對(duì)g_num加1,但結(jié)果仍然是g_num=1

編寫代碼測(cè)試如下:

[root@server01 many_task]# vim test4.py #coding=utf-8import threadingfrom time import sleep,ctime# 初始化g_numg_num = 0def add_func1(num): global g_num for i in range(num): g_num += 1 print('add_func1,第%d次,g_num等于%d' % (i,g_num)) #sleep(0.5)def add_func2(num): global g_num for i in range(num): g_num += 1 print('add_func2,第%d次,g_num等于%d' % (i,g_num)) #sleep(0.5)def main(): # 執(zhí)行線程 t1 = threading.Thread(target=add_func1,args=(100,)) t2 = threading.Thread(target=add_func2,args=(100,)) t1.start() t2.start() # 判斷當(dāng)線程存在,則等待1秒 while len(threading.enumerate()) > 1: sleep(1) print('2個(gè)線程對(duì)同一個(gè)全局變量操作之后的最終結(jié)果是:%s' % g_num)if __name__ == ’__main__’: main()

執(zhí)行如下:

add_func2,第96次,g_num等于197add_func2,第97次,g_num等于198add_func2,第98次,g_num等于199add_func2,第99次,g_num等于2002個(gè)線程對(duì)同一個(gè)全局變量操作之后的最終結(jié)果是:200[root@server01 many_task]#

兩個(gè)線程雖然執(zhí)行很快,但是g_num恰好就是100+100=200的結(jié)果,是正確的。不過(guò),這個(gè)數(shù)量少,可能看不出問(wèn)題來(lái)。

測(cè)試示例2

[root@server01 many_task]# vim test7.py def work1(num): global g_num for i in range(num): g_num += 1 print('----in work1, g_num is %d---'%g_num)def work2(num): global g_num for i in range(num): g_num += 1 print('----in work2, g_num is %d---'%g_num)print('---線程創(chuàng)建之前g_num is %d---'%g_num)t1 = threading.Thread(target=work1, args=(10000000,))t1.start()t2 = threading.Thread(target=work2, args=(10000000,))t2.start()while len(threading.enumerate()) != 1: time.sleep(1)print('2個(gè)線程對(duì)同一個(gè)全局變量操作之后的最終結(jié)果是:%s' % g_num)

運(yùn)行如下:

[root@server01 many_task]# python test7.py ---線程創(chuàng)建之前g_num is 0-------in work1, g_num is 11977799-------in work2, g_num is 19108796---2個(gè)線程對(duì)同一個(gè)全局變量操作之后的最終結(jié)果是:19108796[root@server01 many_task]#

正確的結(jié)果應(yīng)該是:20000000

結(jié)論

如果多個(gè)線程同時(shí)對(duì)同一個(gè)全局變量操作,會(huì)出現(xiàn)資源競(jìng)爭(zhēng)問(wèn)題,從而數(shù)據(jù)結(jié)果會(huì)不正確

到此這篇關(guān)于Python 多線程共享變量的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Python 多線程共享變量?jī)?nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产高清在线精品一区a | 亚洲欧美专区精品久久 | 免费v片视频在线观看视频 免费v片在线观看 | 国语自产精品视频 | 久99频这里只精品23热 视频 | 黄色三级网络 | 1024香蕉视频在线播放 | 欧美一区二区三区日韩免费播 | 亚洲国产精品ⅴa在线观看 亚洲国产精品aaa一区 | 青青热久久国产久精品秒播 | 久久精品国产99久久 | 97精品国产高清在线看入口 | 国产午夜免费不卡精品理论片 | 韩国日本三级在线观看 | 黄色三级在线播放 | 亚洲欧美大片 | 国产99久久久久久免费看 | 成人毛片视频免费网站观看 | 女人18毛片a级毛片 女人aaaaa片一级一毛片 | a毛片免费全部在线播放毛 a毛片免费视频 | 国产成人亚洲合集青青草原精品 | 国内成人自拍 | 国内成人精品亚洲日本语音 | 国产精品一区二区三区免费 | 亚洲欧美专区精品久久 | 欧美做爰野外在线视频观看 | 精品国产欧美一区二区五十路 | 国产片91人成在线观看 | 九九视频在线观看视频6偷拍 | 美女美女大片黄a大片 | 欧美经典成人在观看线视频 | 国产成人亚洲合集青青草原精品 | 国产午夜永久福利视频在线观看 | 亚洲成a人片在线观看中文!!! | 欧美人成片免费看视频不卡 | 成人夜色香网站在线观看 | 深夜福利视频在线观看免费播放 | 香蕉香蕉国产片一级一级毛片 | 久久www免费人成精品 | 手机看片国产 | 国产视频自拍偷拍 |