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

淺談python多線程和多線程變量共享問題介紹

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

1、demo

第一個代碼是多線程的簡單使用,編寫了線程如何執(zhí)行函數(shù)和類。

import threading
import time
class ClassName(threading.Thread):
	"""創(chuàng)建類,通過多線程執(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()
	
	# 啟動線程
	t1.start()
	t2.start()
	t.start()

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

if __name__ == '__main__':
	main()

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

2、多線程共享變量

通過定義全局變量,然后再test1函數(shù)類部進行更改全局變量,test2打印全局變量。

import threading
import time

#定義全局變量
g_num = 0

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

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

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

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

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

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

if __name__ == '__main__':
	main()

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

3、資源競爭

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

import threading
import time

# 定義全局變量
g_num = 0

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

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

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

	print("tes2 線程 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("主線程 g_num = %d---" % g_num)

if __name__ == '__main__':
	main()

可以先試試傳遞參數(shù)為100時,可以看到g_num = 200 這是因為函數(shù)代碼可以一次性執(zhí)行完成,當參數(shù)為1000000時代碼無法一次性執(zhí)行完成,g_num!= 2000000

4、互斥鎖

互斥鎖可以解決資源競爭的問題,原理很簡單,通過對代碼塊上鎖,保證該代碼執(zhí)行完成前,其它代碼無法進行修改。執(zhí)行完成后解鎖,其它代碼就可以執(zhí)行了。

import threading
import time

# 創(chuàng)建變量
g_num = 0
# 創(chuàng)建鎖默認為開鎖狀態(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 線程 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 線程 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("--- 主線程 g_num = %d---" % g_num)

if __name__ == '__main__':
	main()

可以看到加了鎖之后,代碼執(zhí)行不會出現(xiàn)資源競爭,結果也是正常的?;コ怄i,上鎖的代碼越少越好。

5、死鎖

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

import threading
import time

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

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

	# mutexA上鎖后,延時1秒,等待mutexB上鎖
	print("test1 ---do1---up---")
	time.sleep(1)
	# 此時會堵塞,因為mutexB已經(jīng)上鎖
	mutexB.acquire()
	print("test1 ---do1---down---")
	mutexB.release()

	# 對mutexA解鎖
	mutexA.release()

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

	# mutexB上鎖后,延時1秒,等待mutexA上鎖
	print("test2 ---do1---up---")
	time.sleep(1)
	# 此時會堵塞,因為mutexB已經(jīng)上鎖
	mutexA.acquire()
	print("test2 ---do1---down---")
	mutexA.release()

	# 對mutexA解鎖
	mutexB.release()

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

	t1.start()
	t2.start()


if __name__ == '__main__':
	main()

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

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

相關文章

  • python+playwright微軟自動化工具的使用

    python+playwright微軟自動化工具的使用

    這篇文章主要介紹了python+playwright微軟自動化工具的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • 在Python中使用循環(huán)進行迭代的方法小結

    在Python中使用循環(huán)進行迭代的方法小結

    Python中的循環(huán)結構是編程中的重要組成部分,本文詳細介紹這兩種循環(huán)的使用方法、它們之間的差異以及如何選擇合適的循環(huán)類型,此外,我還將介紹一些高級循環(huán)控制技巧,如列表推導式和生成器表達式,感興趣的朋友一起看看吧
    2024-01-01
  • Python使用POP3和SMTP協(xié)議收發(fā)郵件的示例代碼

    Python使用POP3和SMTP協(xié)議收發(fā)郵件的示例代碼

    這篇文章主要介紹了Python使用POP3和SMTP協(xié)議收發(fā)郵件的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Scrapy抓取京東商品、豆瓣電影及代碼分享

    Scrapy抓取京東商品、豆瓣電影及代碼分享

    Scrapy,Python開發(fā)的一個快速、高層次的屏幕抓取和web抓取框架,用于抓取web站點并從頁面中提取結構化的數(shù)據(jù)。Scrapy用途廣泛,可以用于數(shù)據(jù)挖掘、監(jiān)測和自動化測試。
    2017-11-11
  • Python爬蟲之超級鷹驗證碼應用

    Python爬蟲之超級鷹驗證碼應用

    眾所周知python是一個很強大的語言,它擁有眾多的庫,今天我嘗試了使用超級鷹第三方平臺進行驗證碼的開發(fā),需要的朋友可以參考下
    2022-08-08
  • jupyter運行時左邊一直出現(xiàn)*號問題及解決

    jupyter運行時左邊一直出現(xiàn)*號問題及解決

    這篇文章主要介紹了jupyter運行時左邊一直出現(xiàn)*號問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python 經(jīng)典貪心算法之Prim算法案例詳解

    Python 經(jīng)典貪心算法之Prim算法案例詳解

    這篇文章主要介紹了Python 經(jīng)典貪心算法之Prim算法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • Python裝飾器原理與簡單用法實例分析

    Python裝飾器原理與簡單用法實例分析

    這篇文章主要介紹了Python裝飾器原理與簡單用法,結合實例形式分析了Python裝飾器的概念、原理、使用方法及相關注意事項,需要的朋友可以參考下
    2018-04-04
  • 自己搭建resnet18網(wǎng)絡并加載torchvision自帶權重的操作

    自己搭建resnet18網(wǎng)絡并加載torchvision自帶權重的操作

    這篇文章主要介紹了自己搭建resnet18網(wǎng)絡并加載torchvision自帶權重的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 探索Python列表合并技術提高代碼靈活性

    探索Python列表合并技術提高代碼靈活性

    本文將深入研究Python中列表合并的幾種方法,通過詳細的示例代碼和細致的解釋,呈現(xiàn)一場關于列表操作的精彩探險,無論是初學者還是有經(jīng)驗的開發(fā)者,通過學習本文,將更加熟練地運用這些方法,提升代碼的效率和可讀性
    2024-01-01

最新評論