本文主要是闡述了線程同步python的完成及線程同步有序化,線程同步多用于與此同時(shí)啟用好幾個(gè)函數(shù)公式,cpu時(shí)間片輪著分給好幾個(gè)每日任務(wù)
序言
線程同步多用于與此同時(shí)啟用好幾個(gè)函數(shù)公式,cpu時(shí)間片輪著分給好幾個(gè)每日任務(wù)。特點(diǎn)是提升cpu的利用率,使電子計(jì)算機(jī)降低解決好幾個(gè)任務(wù)總時(shí)長;主要缺點(diǎn)若是有靜態(tài)變量,啟用好幾個(gè)函數(shù)公式會(huì)讓靜態(tài)變量被好幾個(gè)函數(shù)公式改動(dòng),導(dǎo)致計(jì)算誤差,這使得必須使用join方法或是設(shè)定靜態(tài)變量去解決問題。python使用threading模塊來達(dá)到線程同步,threading.join()方法是什么確保調(diào)用join的子線程結(jié)束后,才能分派cpu給其它的子線程,充分保證進(jìn)程運(yùn)轉(zhuǎn)的有序化。
一、線程同步運(yùn)作混亂難題
我們首先要建立3個(gè)案例,t1,t2,t3t1案例調(diào)用function1函數(shù)公式,t2和t3調(diào)用函數(shù)function11函數(shù)公式,她們都是對(duì)靜態(tài)變量l1來操作
代碼如下:
import threading,time l1=[] #創(chuàng)建RLock鎖,acquire幾次,release幾次 lock=threading.RLock() def function1(x,y): for i in range(x): l1.append(i) if i==0: time.sleep(1) end_time=time.time() print("t{}is finished in{}s".format(y,end_time-time1)) def function11(x,y): for i in range(x): l1.append(i) end_time=time.time() print("t{}is finished in{}s".format(y,end_time-time1)) #2.創(chuàng)建子線程:thread類 if __name__=='__main__': t1=threading.Thread(target=function1,args=(100,1)) t2=threading.Thread(target=function11,args=(100,2)) t3=threading.Thread(target=function11,args=(100,3)) time1=time.time() print("time starts in{}".format(time1)) t1.start() t2.start() t3.start() print(l1)
結(jié)果如下:
runfile('E:/桌面/temp.py',wdir='E:/桌面')
time starts in 1656474963.9487
t2 is finished in 0.0s
t3 is finished in 0.0s
[0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]
t1 is finished in 1.0152690410614014s
我們可以看到,全局變量中開頭有兩個(gè)0,而不是按著0,1,2,3的方式按序填充,所以可以得知全局變量在多線程中是被多個(gè)函數(shù)無序調(diào)用的。為了保證多線程有序調(diào)用全局變量,我們可以利用threading.join()的方法。
二、“join方法”解決多線程運(yùn)行無序問題
我們重寫了function1函數(shù),并命名為function2,t1調(diào)用function2函數(shù)。t2,t3不變。
代碼如下:
import threading,time l1=[] #創(chuàng)建RLock鎖,acquire幾次,release幾次 lock=threading.RLock() def function1(x,y): for i in range(x): l1.append(i) if i==0: time.sleep(1) end_time=time.time() print("t{}is finished in{}s".format(y,end_time-time1)) def function11(x,y): for i in range(x): l1.append(i) end_time=time.time() print("t{}is finished in{}s".format(y,end_time-time1)) def function2(x,y): for i in range(x): l1.append(i) if i==0: time.sleep(1) end_time=time.time() print("t{}is finished in{}s".format(y,end_time-time1)) #2.創(chuàng)建子線程:thread類 if __name__=='__main__': t1=threading.Thread(target=function2,args=(100,1)) t2=threading.Thread(target=function11,args=(100,2)) t3=threading.Thread(target=function11,args=(100,3)) time1=time.time() print("time starts in{}".format(time1)) t1.start() t1.join() t2.start() t3.start() print(l1)
結(jié)果如下:
runfile('E:/桌面/temp.py',wdir='E:/桌面')
time starts in 1656476057.441827
t1 is finished in 1.0155227184295654s
t2 is finished in 1.0155227184295654s
t3 is finished in 1.0155227184295654s
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]
由此可見,threading.join()方法可以解決多線程無序問題
三、threading.Thread()的常見主要參數(shù)
1.group:初始值None,要實(shí)現(xiàn)ThreadGroup類而保存
2.target:在start方法中啟用可啟用目標(biāo),即必須打開進(jìn)程可啟用目標(biāo),例如函數(shù)公式、方式
3.name:默認(rèn)“Thread-N”,字符數(shù)組方式的進(jìn)程名字
4.args:默認(rèn)空數(shù)組,主要參數(shù)target中傳到可啟用對(duì)象主要參數(shù)數(shù)組
5.kwargs:默認(rèn)空詞典{},主要參數(shù)target中傳到可啟用對(duì)象關(guān)鍵字參數(shù)詞典
6.daemon:默認(rèn)None
匯總
到這里這一篇有關(guān)線程同步python的完成及線程同步井然有序類文章就分享到這了
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/128716.html
摘要:的鎖是非公平鎖,默認(rèn)情況下也是非公平鎖,但可以通過帶布爾值的構(gòu)造函數(shù)要求使用公平鎖。有序性,是保證線程內(nèi)串行語義,避免指令重排等。公平性是減少線程饑餓個(gè)別線程長期等待鎖,但始終無法獲取情況發(fā)生的一個(gè)辦法。 目錄介紹 1.Synchronize和ReentrantLock區(qū)別 1.1 相似點(diǎn) 1.2 區(qū)別 1.3 什么是線程安全問題?如何理解 1.4 線程安全需要保證幾個(gè)基本特性 ...
摘要:內(nèi)存之間的交互關(guān)于主內(nèi)存和工作內(nèi)存之間的具體交互協(xié)議,內(nèi)存模型定義了中操作來完成,虛擬機(jī)實(shí)現(xiàn)的時(shí)候必須保證每個(gè)操作都是原子的,不可分割的對(duì)于和有例外鎖定作用于主內(nèi)存變量,代表一個(gè)變量是一條線程獨(dú)占。 并發(fā)不一定依賴多線程,但是在java里面談?wù)摬l(fā),大多與線程脫不開關(guān)系。 線程是大多是面試都會(huì)問到的問題。我們都知道,線程是比進(jìn)程更輕量級(jí)的調(diào)度單位,線程之間可以共享內(nèi)存。之前面試的時(shí)候,...
摘要:目的是解決由于多線程通過共享內(nèi)存進(jìn)行通信時(shí),存在的原子性可見性緩存一致性以及有序性問題。最多只有一個(gè)線程能持有鎖。線程加入規(guī)則對(duì)象的結(jié)束先行發(fā)生于方法返回。 前言 學(xué)習(xí)情況記錄 時(shí)間:week 1 SMART子目標(biāo) :Java 多線程 學(xué)習(xí)Java多線程,要了解多線程可能出現(xiàn)的并發(fā)現(xiàn)象,了解Java內(nèi)存模型的知識(shí)是必不可少的。 對(duì)學(xué)習(xí)到的重要知識(shí)點(diǎn)進(jìn)行的記錄。 注:這里提到的是Ja...
摘要:內(nèi)存模型對(duì)內(nèi)存模型的介紹對(duì)內(nèi)存模型的結(jié)構(gòu)圖的線程之間的通信是通過共享內(nèi)存的方式進(jìn)行隱式通信,即線程把某狀態(tài)寫入主內(nèi)存中的共享變量,線程讀取的值,這樣就完成了通信。 Java內(nèi)存模型(JMM) 1.對(duì)內(nèi)存模型的介紹 ①對(duì)Java內(nèi)存模型的結(jié)構(gòu)圖 java的線程之間的通信是通過共享內(nèi)存的方式進(jìn)行隱式通信,即線程A把某狀態(tài)寫入主內(nèi)存中的共享變量X,線程B讀取X的值,這樣就完成了通信。是一種...
摘要:文章簡介分析的作用以及底層實(shí)現(xiàn)原理,這也是大公司喜歡問的問題內(nèi)容導(dǎo)航的作用什么是可見性源碼分析的作用在多線程中,和都起到非常重要的作用,是通過加鎖來實(shí)現(xiàn)線程的安全性。而的主要作用是在多處理器開發(fā)中保證共享變量對(duì)于多線程的可見性。 文章簡介 分析volatile的作用以及底層實(shí)現(xiàn)原理,這也是大公司喜歡問的問題 內(nèi)容導(dǎo)航 volatile的作用 什么是可見性 volatile源碼分析 ...
閱讀 923·2023-01-14 11:38
閱讀 895·2023-01-14 11:04
閱讀 756·2023-01-14 10:48
閱讀 2055·2023-01-14 10:34
閱讀 961·2023-01-14 10:24
閱讀 840·2023-01-14 10:18
閱讀 510·2023-01-14 10:09
閱讀 588·2023-01-14 10:02