中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現Python多線程共享變量

發布時間:2020-08-03 10:14:05 來源:億速云 閱讀:145 作者:小豬 欄目:開發技術

小編這次要給大家分享的是如何實現Python多線程共享變量,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

多線程-共享全局變量

#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("---線程創建之前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-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])

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

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

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

假設兩個線程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-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():
 # 執行線程
 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等于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]#

兩個線程雖然執行很快,但是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多線程共享變量的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙门县| 美姑县| 贵定县| 昌都县| 太康县| 永宁县| 伊宁县| 呼伦贝尔市| 米泉市| 拜城县| 墨玉县| 滨州市| 宝兴县| 新丰县| 崇明县| 特克斯县| 丹寨县| 锦州市| 林州市| 吕梁市| 新余市| 峨眉山市| 朝阳区| 临汾市| 中阳县| 静乐县| 遵化市| 葫芦岛市| 哈尔滨市| 象山县| 兴和县| 积石山| 彰化市| 榆林市| 城口县| 宿迁市| 鄢陵县| 资兴市| 黑龙江省| 礼泉县| 龙岩市|