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

淺談python多線(xiàn)程和多線(xiàn)程變量共享問(wèn)題介紹

 更新時(shí)間:2020年04月17日 10:31:59   作者:Record learning  
這篇文章主要介紹了淺談python多線(xiàn)程和多線(xiàn)程變量共享問(wèn)題介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1、demo

第一個(gè)代碼是多線(xiàn)程的簡(jiǎn)單使用,編寫(xiě)了線(xiàn)程如何執(zhí)行函數(shù)和類(lèi)。

import threading
import time
class ClassName(threading.Thread):
	"""創(chuàng)建類(lèi),通過(guò)多線(xiàn)程執(zhí)行"""
	def run(self):
		for i in range(5):
			print(i)
			time.sleep(1)

def sing():
	for i in range(1,11):
		print("唱歌第 %d 遍" % i)
		time.sleep(1)

def dance():
	for i in range(1,16):
		print("跳舞第 %d 遍" % i)
		time.sleep(1)

def main():
	t1 = threading.Thread(target = sing)
	t2 = threading.Thread(target = dance)
	t = ClassName()
	
	# 啟動(dòng)線(xiàn)程
	t1.start()
	t2.start()
	t.start()

	while True:
		length = len(threading.enumerate())
		print("正在運(yùn)行的線(xiàn)程有 %s" %threading.enumerate())
	
		if length <= 1:
			break
		time.sleep(1)

if __name__ == '__main__':
	main()

執(zhí)行結(jié)果可以看到函數(shù) sing、dance和類(lèi)在同時(shí)執(zhí)行,執(zhí)行效果太長(zhǎng)就不方截圖了

2、多線(xiàn)程共享變量

通過(guò)定義全局變量,然后再test1函數(shù)類(lèi)部進(jìn)行更改全局變量,test2打印全局變量。

import threading
import time

#定義全局變量
g_num = 0

def test1():
	"""函數(shù)test1對(duì)全局變量進(jìn)行更改"""
	global g_num
	for i in range(1,10):
		g_num += 1

	print("--- test1 線(xiàn)程 g_num = %d--- " % g_num)

def test2():
	"""函數(shù)test2 打印全局變量"""
	print("--- test2 線(xiàn)程 g_num = %d--- " % g_num)

def main():
	t1 = threading.Thread(target=test1)
	t2 = threading.Thread(target=test2)

	# 啟動(dòng)線(xiàn)程
	t1.start()
	# 增加睡眠是為了保證優(yōu)先執(zhí)行函數(shù)test1
	time.sleep(1)
	t2.start()

	print("--- 主線(xiàn)程 g_num = %d--- " % g_num)

if __name__ == '__main__':
	main()

執(zhí)行結(jié)果可以看出,在主線(xiàn)程和創(chuàng)建的兩個(gè)線(xiàn)程中讀取的是一樣的值,既可以表明在多線(xiàn)程中變量共享

3、資源競(jìng)爭(zhēng)

在多線(xiàn)程兩個(gè)函數(shù)中同時(shí)更改一個(gè)變量時(shí),由于cpu的計(jì)算能力,當(dāng)修改參數(shù)的代碼塊無(wú)法一次性執(zhí)行完成時(shí),就會(huì)產(chǎn)生資源競(jìng)爭(zhēng)

import threading
import time

# 定義全局變量
g_num = 0

def test1(num):
	"""函數(shù)test1對(duì)全局變量進(jìn)行更改"""
	global g_num
	for i in range(num):
		g_num += 1

	print("test1 線(xiàn)程 g_num = %d---" % g_num)

def test2(num):
	"""函數(shù)test2對(duì)全局變量進(jìn)行更改"""
	global g_num
	for i in range(num):
		g_num += 1

	print("tes2 線(xiàn)程 g_num = %d---" % g_num)

def main():
	t1 = threading.Thread(target=test1, args=(1000000, ))
	t2 = threading.Thread(target=test2, args=(1000000, ))

	t1.start()
	t2.start()

	time.sleep(1)
	print("主線(xiàn)程 g_num = %d---" % g_num)

if __name__ == '__main__':
	main()

可以先試試傳遞參數(shù)為100時(shí),可以看到g_num = 200 這是因?yàn)楹瘮?shù)代碼可以一次性執(zhí)行完成,當(dāng)參數(shù)為1000000時(shí)代碼無(wú)法一次性執(zhí)行完成,g_num!= 2000000

4、互斥鎖

互斥鎖可以解決資源競(jìng)爭(zhēng)的問(wèn)題,原理很簡(jiǎn)單,通過(guò)對(duì)代碼塊上鎖,保證該代碼執(zhí)行完成前,其它代碼無(wú)法進(jìn)行修改。執(zhí)行完成后解鎖,其它代碼就可以執(zhí)行了。

import threading
import time

# 創(chuàng)建變量
g_num = 0
# 創(chuàng)建鎖默認(rèn)為開(kāi)鎖狀態(tài)
mutex = threading.Lock()

def test1(num):
	global g_num
	for i in range(num):
		# 上鎖
		mutex.acquire()
		g_num += 1
		# 解鎖
		mutex.release()
	print("--- test1 線(xiàn)程 g_num = %d---" % g_num)

def test2(num):
	global g_num
	for i in range(num):
		# 上鎖
		mutex.acquire()
		g_num += 1
		# 解鎖
		mutex.release()

	print("--- test2 線(xiàn)程 g_num = %d---" % g_num)

def main():
	t1 = threading.Thread(target=test1, args=(1000000, ))
	t2 = threading.Thread(target=test2, args=(1000000, ))

	t1.start()
	t2.start()

	time.sleep(1)
	print("--- 主線(xiàn)程 g_num = %d---" % g_num)

if __name__ == '__main__':
	main()

可以看到加了鎖之后,代碼執(zhí)行不會(huì)出現(xiàn)資源競(jìng)爭(zhēng),結(jié)果也是正常的。互斥鎖,上鎖的代碼越少越好。

5、死鎖

當(dāng)出現(xiàn)多個(gè)鎖時(shí),就可能會(huì)產(chǎn)生死鎖這個(gè)情況。當(dāng)關(guān)閉一個(gè)鎖時(shí),這個(gè)鎖已經(jīng)為關(guān)閉狀態(tài)的話(huà),程序就會(huì)阻塞。就如同下面這個(gè)代碼中。函數(shù)test1關(guān)閉mutexB鎖時(shí),函數(shù)test2提前將其關(guān)閉了,未進(jìn)行解鎖,程序就會(huì)一直阻塞。

import threading
import time

# 創(chuàng)建兩個(gè)鎖A, B
mutexA = threading.Lock()
mutexB = threading.Lock()

def test1():
	# 對(duì)muctexA上鎖
	mutexA.acquire()

	# mutexA上鎖后,延時(shí)1秒,等待mutexB上鎖
	print("test1 ---do1---up---")
	time.sleep(1)
	# 此時(shí)會(huì)堵塞,因?yàn)閙utexB已經(jīng)上鎖
	mutexB.acquire()
	print("test1 ---do1---down---")
	mutexB.release()

	# 對(duì)mutexA解鎖
	mutexA.release()

def test2():
	# 對(duì)muctexB上鎖
	mutexB.acquire()

	# mutexB上鎖后,延時(shí)1秒,等待mutexA上鎖
	print("test2 ---do1---up---")
	time.sleep(1)
	# 此時(shí)會(huì)堵塞,因?yàn)閙utexB已經(jīng)上鎖
	mutexA.acquire()
	print("test2 ---do1---down---")
	mutexA.release()

	# 對(duì)mutexA解鎖
	mutexB.release()

def main():
	t1 = threading.Thread(target=test1)
	t2 = threading.Thread(target=test2)

	t1.start()
	t2.start()


if __name__ == '__main__':
	main()

代碼執(zhí)行效果可以看到程序會(huì)一直阻塞
解決方法
1、在程序編寫(xiě)時(shí),就需要注意避免死鎖
2、可以參考銀行家算法

到此這篇關(guān)于淺談python多線(xiàn)程和多線(xiàn)程變量共享問(wèn)題介紹的文章就介紹到這了,更多相關(guān)python 多線(xiàn)程變量共享內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python爬蟲(chóng)之自動(dòng)爬取某車(chē)之家各車(chē)銷(xiāo)售數(shù)據(jù)

    Python爬蟲(chóng)之自動(dòng)爬取某車(chē)之家各車(chē)銷(xiāo)售數(shù)據(jù)

    應(yīng)朋友要求,幫忙采集某車(chē)之家的一些汽車(chē)品牌的銷(xiāo)售數(shù)據(jù),包含購(gòu)車(chē)時(shí)間、車(chē)型、經(jīng)銷(xiāo)商、裸車(chē)價(jià)等一類(lèi)信息. 今天我們就簡(jiǎn)單演示一下采集過(guò)程,大家可以根據(jù)自己的興趣進(jìn)行拓展.比如采集自己喜歡的品牌汽車(chē)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析等等,需要的朋友可以參考下
    2021-06-06
  • PyTorch并行訓(xùn)練DistributedDataParallel完整demo

    PyTorch并行訓(xùn)練DistributedDataParallel完整demo

    這篇文章主要為大家介紹了PyTorch并行訓(xùn)練DistributedDataParallel完整demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • python 淘寶爬蟲(chóng)小實(shí)例

    python 淘寶爬蟲(chóng)小實(shí)例

    雙十一即將到來(lái),電商都在做活動(dòng)打折,但打完折是不是真的優(yōu)惠了,需要我們自己斟酌,畢竟我們不能一直關(guān)注著價(jià)格,也自然不能知道現(xiàn)在的價(jià)格比以前高了還是低了,今天讓我們用Python來(lái)爬取一下淘寶吧
    2021-11-11
  • python 常見(jiàn)字符串與函數(shù)的用法詳解

    python 常見(jiàn)字符串與函數(shù)的用法詳解

    這篇文章主要介紹了python 常見(jiàn)字符串與函數(shù)的用法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • 使用Python實(shí)現(xiàn)操作控制鼠標(biāo)和鍵盤(pán)

    使用Python實(shí)現(xiàn)操作控制鼠標(biāo)和鍵盤(pán)

    Python 有很多的庫(kù)可以實(shí)現(xiàn)各種各樣的功能,比如使用 pynput 操作,下面小編就來(lái)和大家詳細(xì)介紹一下如何使用pynput進(jìn)行操作控制鼠標(biāo)和鍵盤(pán)吧
    2024-02-02
  • Python學(xué)習(xí)之pip包管理工具的使用

    Python學(xué)習(xí)之pip包管理工具的使用

    學(xué)習(xí)?Python?的過(guò)程中,經(jīng)常會(huì)使用?pip?命令去安裝第三方模塊。pip?是?Python?默認(rèn)集成的包管理工具,而其本質(zhì)就是?Python?標(biāo)準(zhǔn)庫(kù)中的一個(gè)包,只是比較特殊一些。本文就來(lái)為你你全面揭示一下?pip?包管理工具的使用
    2022-08-08
  • Python translator使用實(shí)例

    Python translator使用實(shí)例

    translator實(shí)例應(yīng)用代碼
    2008-09-09
  • python文件選擇對(duì)話(huà)框的操作方法

    python文件選擇對(duì)話(huà)框的操作方法

    這篇文章主要介紹了python文件選擇對(duì)話(huà)框的操作方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • python通過(guò)zlib實(shí)現(xiàn)壓縮與解壓字符串的方法

    python通過(guò)zlib實(shí)現(xiàn)壓縮與解壓字符串的方法

    這篇文章主要介紹了python通過(guò)zlib實(shí)現(xiàn)壓縮與解壓字符串的方法,較為詳細(xì)的介紹了zlib的用法及使用zlib.compressobj和zlib.decompressobj對(duì)文件進(jìn)行壓縮解壓的方法,需要的朋友可以參考下
    2014-11-11
  • Python筆記(叁)繼續(xù)學(xué)習(xí)

    Python筆記(叁)繼續(xù)學(xué)習(xí)

    最近時(shí)間擠來(lái)擠去,看英文的文檔,順便熟悉英語(yǔ),需要反復(fù)好幾遍,才能做點(diǎn)筆記。讀的是《Beginning.Python.From.Novice.to.Professional》,大家可以下載看一下
    2012-10-10

最新評(píng)論

湘西| 昌图县| 巴青县| 宣汉县| 贡嘎县| 望谟县| 靖远县| 虎林市| 土默特左旗| 大竹县| 肇庆市| 西平县| 临沧市| 丘北县| 通山县| 屏山县| 林州市| 新郑市| 海口市| 麻江县| 淳安县| 永昌县| 潜山县| 泉州市| 大化| 会昌县| 萍乡市| 论坛| 龙山县| 当阳市| 鸡西市| 安乡县| 景谷| 尖扎县| 常德市| 麻阳| 泰和县| 马尔康县| 甘南县| 巴南区| 曲周县|