最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python進(jìn)階之多線程對同一個全局變量的處理方法

 更新時間:2018年11月09日 09:36:26   作者:Jonny0318  
今天小編就為大家分享一篇python進(jìn)階之多線程對同一個全局變量的處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

通常情況下:

from threading import Thread
 
global_num = 0
 
def func1():
 global global_num
 for i in range(1000000):
 global_num += 1
 print('---------func1:global_num=%s--------'%global_num)
 
def func2():
 global global_num
 for i in range(1000000):
 global_num += 1
 print('--------fun2:global_num=%s'%global_num)
print('global_num=%s'%global_num)
 
lock = Lock()
 
t1 = Thread(target=func1)
t1.start()
 
t2 = Thread(target=func2)
t2.start()

輸出結(jié)果:

global_num=0
---------func1:global_num=1492752--------
--------fun2:global_num=1515462

#由于多線程不像多進(jìn)程一樣,每一個進(jìn)程都一個獨立的資源塊,線程之間是共享主線程的一個資源塊(雖然這樣說不合適)

#這樣雖然方便了線程之間的數(shù)據(jù)傳遞,但是又會由于線程之間執(zhí)行順序的不確定,導(dǎo)致最后的結(jié)果不是應(yīng)該輸出的正確結(jié)果。

#例如下面的例程,如果沒有添加global_flag標(biāo)志全局變量,就會出現(xiàn),雖然邏輯上最后的結(jié)果是2000000(之所以選擇這么大的一個數(shù),是因為可以更明顯的看出#這個問題),

#但是實際上并不是這個結(jié)果,而是一個小于2000000的結(jié)果,但是不排出偶然會出現(xiàn)2000000,這是一個極為理想的結(jié)果,這是為什么呢?

#主要還是由于線程被cpu調(diào)用的順序不確定。具體來講就是當(dāng)主線程創(chuàng)建出兩個子線程,分別是t1和t2,他們有分別指向func1()和func2()。

#在這兩個線程中的函數(shù)中,都有一句“global_num += 1”,在計算機內(nèi)部cpu執(zhí)行時,這一條語句實際上是兩個過程:第一個過程是從內(nèi)存中讀取global_num的值,完成加一操作,這個時候global_num的值還是原來的值;第二個過程是將求和的值付給global_num,這時候global_num的值才會更新。在程序執(zhí)行過程中會出現(xiàn)這種

#情況:當(dāng)cpu在執(zhí)行線程t1中的語句到求和那條語句時,在執(zhí)行完第一個過程停了下來,將線程t1拋出,轉(zhuǎn)而執(zhí)行線程t2,當(dāng)線程執(zhí)行一段時間后也出現(xiàn)這中情況

#有轉(zhuǎn)而執(zhí)行線程t1,這時,正好執(zhí)行求和語句的第二個過程,完成最初的賦值,那么這一段時間內(nèi)的整個求和就等于沒做,所以出現(xiàn)這中最后結(jié)果不是2000000的##情況

#解決這種情況可以利用添加一個變量,利用“輪詢”的方式執(zhí)行,但是這樣做的效率很低,而且還浪費cpu,所以一般采用“通知”方式來做。

輪詢方式:

from threading import Thread
 
global_num = 0
global_flag = 0
 
def func1():
	global global_num
	global global_flag
	if global_flag == 0:
		for i in range(1000000):
			global_num += 1
	global_flag = 1	
	print('---------func1:global_num=%s--------'%global_num)
 
def func2():
	global global_num
	while True:
		if global_flag != 0:
			for i in range(1000000):
				global_num += 1
			break
	print('--------fun2:global_num=%s'%global_num)
 
print('global_num=%s'%global_num)
 
t1 = Thread(target=func1)
t1.start()
 
t2 = Thread(target=func2)
t2.start()

運行結(jié)果:

global_num=0
---------func1:global_num=1000000--------
--------fun2:global_num=2000000

通知方式:

from threading import Thread,Lock
 
 
global_num = 0
 
def func1():
	global global_num
	for i in range(1000000):
		lock.acquire()#兩個線程會最開始搶這個鎖,拿到鎖就會處于關(guān)鎖,執(zhí)行后面的程序,其他線程執(zhí)行處于監(jiān)聽狀態(tài),等待這個線程開鎖,再搶鎖
		global_num += 1
		lock.release()
	print('---------func1:global_num=%s--------'%global_num)
 
def func2():
	global global_num
	for i in range(1000000):
		lock.acquire()
		global_num += 1
		lock.release()
	print('--------fun2:global_num=%s'%global_num)
print('global_num=%s'%global_num)
 
lock = Lock()
 
t1 = Thread(target=func1)
t1.start()
 
t2 = Thread(target=func2)
t2.start()

輸出結(jié)果:

global_num=0
---------func1:global_num=1901175--------
--------fun2:global_num=2000000

以上這篇python進(jìn)階之多線程對同一個全局變量的處理方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python安裝jieba庫詳細(xì)教程

    Python安裝jieba庫詳細(xì)教程

    jieba庫是一款優(yōu)秀的 Python 第三方中文分詞庫,jieba 支持三種分詞模式:精確模式、全模式和搜索引擎模式,這篇文章主要介紹了Python安裝jieba庫教程,需要的朋友可以參考下
    2023-03-03
  • Python3計算三角形的面積代碼

    Python3計算三角形的面積代碼

    這篇文章主要介紹了Python3計算三角形的面積代碼,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • PyCharm實現(xiàn)遠(yuǎn)程調(diào)試的全過程(附圖文講解)

    PyCharm實現(xiàn)遠(yuǎn)程調(diào)試的全過程(附圖文講解)

    這篇文章主要介紹了PyCharm實現(xiàn)遠(yuǎn)程調(diào)試的全過程,文中通過圖文結(jié)合的方式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • Python中的簡寫操作(for、if簡寫、匿名函數(shù))

    Python中的簡寫操作(for、if簡寫、匿名函數(shù))

    這篇文章主要介紹了Python中的簡寫操作(for、if簡寫、匿名函數(shù)),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python中xmltodict模塊對XML的用法詳解

    Python中xmltodict模塊對XML的用法詳解

    這篇文章主要介紹了Python中xmltodict模塊對XML的用法詳解,xmltodict?是一個用來處理xml數(shù)據(jù)的很方便的模塊,包含兩個常用方法parse和unparse,本文通過代碼介紹了用法,需要的朋友可以參考下
    2023-07-07
  • Pycharm主題切換(禁用)導(dǎo)致UI界面顯示異常的解決方案

    Pycharm主題切換(禁用)導(dǎo)致UI界面顯示異常的解決方案

    這篇文章主要介紹了Pycharm主題切換(禁用)導(dǎo)致UI界面顯示異常的原因分析和解決方案,文中通過圖文結(jié)合的方式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Python解決線性代數(shù)問題之矩陣的初等變換方法

    Python解決線性代數(shù)問題之矩陣的初等變換方法

    今天小編就為大家分享一篇Python解決線性代數(shù)問題之矩陣的初等變換方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python中hashlib模塊的摘要算法詳解

    Python中hashlib模塊的摘要算法詳解

    這篇文章主要介紹了Python中hashlib模塊的摘要算法詳解,摘要算法又稱哈希算法、散列算法,它通過一個函數(shù),把任意長度的數(shù)據(jù)轉(zhuǎn)換為一個長度固定的數(shù)據(jù)串,通常用16進(jìn)制的字符串表示,需要的朋友可以參考下
    2023-08-08
  • Python類定義和類繼承詳解

    Python類定義和類繼承詳解

    這篇文章主要介紹了Python類定義和類繼承詳解,本文講解了類的私有屬性、類的方法、私有的類方法、類的專有方法、類的定義、類的單繼承、類的多繼承等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • Django--權(quán)限Permissions的例子

    Django--權(quán)限Permissions的例子

    今天小編就為大家分享一篇Django--權(quán)限Permissions的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08

最新評論

新郑市| 洛川县| 庄浪县| 芒康县| 布尔津县| 福州市| 丰都县| 保康县| 宣化县| 合山市| 高唐县| 吐鲁番市| 会泽县| 全南县| 三穗县| 包头市| 江西省| 广元市| 峨眉山市| 左权县| 珲春市| 仁寿县| 林芝县| 昆明市| 阜新| 海盐县| 临海市| 饶河县| 乌拉特前旗| 温州市| 磐石市| 专栏| 格尔木市| 景泰县| 固始县| 芜湖县| 五常市| 渑池县| 于田县| 治县。| 富蕴县|