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

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

Python 多線程共享變量的實現示例

瀏覽:99日期: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('---線程創建之前g_num is %d---'%g_num)t1 = Thread(target=work1)t1.start()#延時一會,保證t1線程中的事情做完time.sleep(1)t2 = Thread(target=work2)t2.start()

執行如下:

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

從上面兩個線程執行的結果來看,線程t1將 g_num 加到 103,在線程t2也是打印g_num=103。所以對于兩個線程,g_num這個全局變量是共享的。

列表當做實參傳遞到線程中

#coding=utf-8from threading import Threadimport timedef work1(nums): nums.append(44) print('----in work1---',nums)def work2(nums): #延時一會,保證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()

運行如下:

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

總結:在一個進程內的所有線程共享全局變量,很方便在多個線程間共享數據缺點就是,線程是對全局變量隨意遂改可能造成多線程之間對全局變量的混亂(即線程非安全)

多線程-共享全局變量問題

多線程開發可能遇到的問題

假設兩個線程t1和t2都要對全局變量g_num(默認是0)進行加1運算,t1和t2都各對g_num加10次,g_num的最終的結果應該為20。

但是由于是多線程同時操作,有可能出現下面情況:

在g_num=0時,t1取得g_num=0。此時系統把t1調度為”sleeping”狀態,把t2轉換為”running”狀態,t2也獲得g_num=0然后t2對得到的值進行加1并賦給g_num,使得g_num=1然后系統又把t2調度為”sleeping”,把t1轉為”running”。線程t1又把它之前得到的0加1后賦值給g_num。這樣導致雖然t1和t2都對g_num加1,但結果仍然是g_num=1

編寫代碼測試如下:

[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(): # 執行線程 t1 = threading.Thread(target=add_func1,args=(100,)) t2 = threading.Thread(target=add_func2,args=(100,)) t1.start() t2.start() # 判斷當線程存在,則等待1秒 while len(threading.enumerate()) > 1: sleep(1) print('2個線程對同一個全局變量操作之后的最終結果是:%s' % g_num)if __name__ == ’__main__’: main()

執行如下:

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

兩個線程雖然執行很快,但是g_num恰好就是100+100=200的結果,是正確的。不過,這個數量少,可能看不出問題來。

測試示例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('---線程創建之前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個線程對同一個全局變量操作之后的最終結果是:%s' % g_num)

運行如下:

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

正確的結果應該是:20000000

結論

如果多個線程同時對同一個全局變量操作,會出現資源競爭問題,從而數據結果會不正確

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

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 精品在线小视频 | 在线观看日本免费视频大片一区 | 噜噜噜狠狠夜夜躁精品 | 黄色美女视频网站 | wwwxx在线| 欧美特黄一级高清免费的香蕉 | 亚洲午夜成激人情在线影院 | 国产精品爱久久久久久久小 | 91av手机在线 | 国产日韩在线观看视频 | 日韩国产欧美一区二区三区 | 免费人成在线 | 黄色a网站| 在线播放一区二区精品产 | 美女张开腿让男人桶爽免费网站 | 国产一级做a爰片在线 | 国产成人aa在线视频 | 国产黄色在线网站 | 欧美日韩一级片在线观看 | 精品久久久久久久九九九精品 | 久久精品国产亚洲网站 | 国产高清自拍一区 | 国产成人精品女人不卡在线 | 久久不见久久见免费影院 | 在线视频亚洲 | 正在播放国产精品放孕妇 | 国产人做人爱免费视频 | 成人性色大片 | 欧美99视频| 国产99网站 | 亚洲午夜在线观看 | 成人ab片 | 免费看一级欧美毛片视频 | 在线精品亚洲欧洲第一页 | 国产一级在线观看视频 | 国产高清一区二区三区免费视频 | videos性欧美 | 国产系列在线播放 | 尹人香蕉久久99天天拍 | 久久精品久久久久 | 久久久成人网 |