本文主要是闡述了線程同步python的完成及線程同步有序化,線程同步多用于與此同時啟用好幾個函數公式,cpu時間片輪著分給好幾個每日任務
序言
線程同步多用于與此同時啟用好幾個函數公式,cpu時間片輪著分給好幾個每日任務。特點是提升cpu的利用率,使電子計算機降低解決好幾個任務總時長;主要缺點若是有靜態變量,啟用好幾個函數公式會讓靜態變量被好幾個函數公式改動,導致計算誤差,這使得必須使用join方法或是設定靜態變量去解決問題。python使用threading模塊來達到線程同步,threading.join()方法是什么確保調用join的子線程結束后,才能分派cpu給其它的子線程,充分保證進程運轉的有序化。
一、線程同步運作混亂難題
我們首先要建立3個案例,t1,t2,t3t1案例調用function1函數公式,t2和t3調用函數function11函數公式,她們都是對靜態變量l1來操作
代碼如下:
import threading,time l1=[] #創建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.創建子線程: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)
結果如下:
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
我們可以看到,全局變量中開頭有兩個0,而不是按著0,1,2,3的方式按序填充,所以可以得知全局變量在多線程中是被多個函數無序調用的。為了保證多線程有序調用全局變量,我們可以利用threading.join()的方法。
二、“join方法”解決多線程運行無序問題
我們重寫了function1函數,并命名為function2,t1調用function2函數。t2,t3不變。
代碼如下:
import threading,time l1=[] #創建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.創建子線程: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)
結果如下:
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()的常見主要參數
1.group:初始值None,要實現ThreadGroup類而保存
2.target:在start方法中啟用可啟用目標,即必須打開進程可啟用目標,例如函數公式、方式
3.name:默認“Thread-N”,字符數組方式的進程名字
4.args:默認空數組,主要參數target中傳到可啟用對象主要參數數組
5.kwargs:默認空詞典{},主要參數target中傳到可啟用對象關鍵字參數詞典
6.daemon:默認None
匯總
到這里這一篇有關線程同步python的完成及線程同步井然有序類文章就分享到這了
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/128716.html
摘要:的鎖是非公平鎖,默認情況下也是非公平鎖,但可以通過帶布爾值的構造函數要求使用公平鎖。有序性,是保證線程內串行語義,避免指令重排等。公平性是減少線程饑餓個別線程長期等待鎖,但始終無法獲取情況發生的一個辦法。 目錄介紹 1.Synchronize和ReentrantLock區別 1.1 相似點 1.2 區別 1.3 什么是線程安全問題?如何理解 1.4 線程安全需要保證幾個基本特性 ...
摘要:內存之間的交互關于主內存和工作內存之間的具體交互協議,內存模型定義了中操作來完成,虛擬機實現的時候必須保證每個操作都是原子的,不可分割的對于和有例外鎖定作用于主內存變量,代表一個變量是一條線程獨占。 并發不一定依賴多線程,但是在java里面談論并發,大多與線程脫不開關系。 線程是大多是面試都會問到的問題。我們都知道,線程是比進程更輕量級的調度單位,線程之間可以共享內存。之前面試的時候,...
摘要:目的是解決由于多線程通過共享內存進行通信時,存在的原子性可見性緩存一致性以及有序性問題。最多只有一個線程能持有鎖。線程加入規則對象的結束先行發生于方法返回。 前言 學習情況記錄 時間:week 1 SMART子目標 :Java 多線程 學習Java多線程,要了解多線程可能出現的并發現象,了解Java內存模型的知識是必不可少的。 對學習到的重要知識點進行的記錄。 注:這里提到的是Ja...
摘要:內存模型對內存模型的介紹對內存模型的結構圖的線程之間的通信是通過共享內存的方式進行隱式通信,即線程把某狀態寫入主內存中的共享變量,線程讀取的值,這樣就完成了通信。 Java內存模型(JMM) 1.對內存模型的介紹 ①對Java內存模型的結構圖 java的線程之間的通信是通過共享內存的方式進行隱式通信,即線程A把某狀態寫入主內存中的共享變量X,線程B讀取X的值,這樣就完成了通信。是一種...
摘要:文章簡介分析的作用以及底層實現原理,這也是大公司喜歡問的問題內容導航的作用什么是可見性源碼分析的作用在多線程中,和都起到非常重要的作用,是通過加鎖來實現線程的安全性。而的主要作用是在多處理器開發中保證共享變量對于多線程的可見性。 文章簡介 分析volatile的作用以及底層實現原理,這也是大公司喜歡問的問題 內容導航 volatile的作用 什么是可見性 volatile源碼分析 ...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1982·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02