欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年04月17日 11:28:41   作者:DevOps海洋的漁夫  
這篇文章主要介紹了Python 多線程共享變量的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

多線程-共享全局變量

#coding=utf-8
from threading import Thread
import time

g_num = 100

def 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()

#延時一會,保證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]#

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

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

#coding=utf-8
from threading import Thread
import time

def 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])

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

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

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

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

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

在g_num=0時,t1取得g_num=0。此時系統(tǒng)把t1調度為”sleeping”狀態(tài),把t2轉換為”running”狀態(tài),t2也獲得g_num=0
然后t2對得到的值進行加1并賦給g_num,使得g_num=1
然后系統(tǒng)又把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-8
import threading
from time import sleep,ctime

# 初始化g_num
g_num = 0

def 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()

 # 判斷當線程存在,則等待1秒
 while len(threading.enumerate()) > 1:
  sleep(1)

 print("2個線程對同一個全局變量操作之后的最終結果是:%s" % g_num)

if __name__ == '__main__':
 main()

執(zhí)行如下:

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

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

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

運行如下:

[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個線程對同一個全局變量操作之后的最終結果是:19108796
[root@server01 many_task]#

正確的結果應該是:20000000

結論

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

到此這篇關于Python 多線程共享變量的實現(xiàn)示例的文章就介紹到這了,更多相關Python 多線程共享變量內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python實現(xiàn)圖片橫向和縱向拼接

    python實現(xiàn)圖片橫向和縱向拼接

    這篇文章主要為大家詳細介紹了python實現(xiàn)圖片橫向和縱向拼接,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Python神器之Pampy模式匹配庫的用法詳解

    Python神器之Pampy模式匹配庫的用法詳解

    Pampy是Python的一個模式匹配類庫,一個只有150行的類庫,該庫優(yōu)雅、高效值得廣大Python的碼農(nóng)加入自己基本開發(fā)棧中。本文就來講講Pampy的用法,需要的可以參考一下
    2022-07-07
  • python解決循環(huán)依賴的問題分析

    python解決循環(huán)依賴的問題分析

    在使用python開發(fā)過程中在引入其他模塊時可能都經(jīng)歷過一個異常就是循環(huán)引用most likely due to a circular import,它的意思就是A引用了B,反過來B又引用了A,導致出現(xiàn)了循環(huán)引用異常,下面來介紹如何避免循環(huán)引用異常,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • python中函數(shù)的參數(shù)詳解

    python中函數(shù)的參數(shù)詳解

    本文詳細講解了python中函數(shù)的參數(shù),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 深入了解Python二維直方圖

    深入了解Python二維直方圖

    只統(tǒng)計像素的灰度值這一特征,可將其成為一維直方圖。二維直方圖可以統(tǒng)計像素的色相和飽和度,用于查找圖像的顏色直方圖。本文將為大家介紹分別使用OpenCV和NumPy函數(shù)計算直方圖,需要的可以學習一下
    2021-12-12
  • Python使用mongodb保存爬取豆瓣電影的數(shù)據(jù)過程解析

    Python使用mongodb保存爬取豆瓣電影的數(shù)據(jù)過程解析

    這篇文章主要介紹了Python使用mongodb保存爬取豆瓣電影的數(shù)據(jù)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Python條件語句的使用

    Python條件語句的使用

    python 語句是按固定順序執(zhí)行的,先執(zhí)行前面的語句,再執(zhí)行后面的語句,這篇文章主要介紹了Python條件語句的用法,需要的朋友可以參考下
    2022-08-08
  • Python StringIO模塊實現(xiàn)在內存緩沖區(qū)中讀寫數(shù)據(jù)

    Python StringIO模塊實現(xiàn)在內存緩沖區(qū)中讀寫數(shù)據(jù)

    這篇文章主要介紹了Python StringIO模塊實現(xiàn)在內存緩沖區(qū)中讀寫數(shù)據(jù),本文講解了使用實例、StringIO類中的方法、文件操作和字符串操作示例等內容,需要的朋友可以參考下
    2015-04-04
  • 基于梯度爆炸的解決方法:clip gradient

    基于梯度爆炸的解決方法:clip gradient

    今天小編就為大家分享一篇基于梯度爆炸的解決方法:clip gradient,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python中update()函數(shù)的使用方法

    python中update()函數(shù)的使用方法

    Python字典update()方法用于更新字典中的鍵/值對,可以修改存在的鍵對應的值,也可以添加新的鍵/值對到字典中,這篇文章主要給大家介紹了關于python中update()函數(shù)的使用方法,需要的朋友可以參考下
    2024-02-02

最新評論