執行緒的理解應該結合程序來對比理解更直接
如果我們作業系統當做乙個工廠的話,那麼建立乙個程序就相當於在這個工廠裡面新增了乙個車間,車間裡面存放了很多資源,而車間要執行起來很顯然的標誌就是流水線,而這些流水線就是執行緒,可以說執行緒是執行**的最小單位。
而執行緒和程序兩者在使用層面上有很大的相似性,所以開啟或者說建立執行緒的2種方式跟建立程序很相似,區別在於匯入的模組和類不一樣而已。
一、開啟執行緒方法:
第一種:
from threading importthread
import
time
deftask(name):
time.sleep(2)
print('
%s has no jj
' %name)
if__name__ == '
__main__':
t=thread(target=task,args=('jj'
,)) t.start()
print('
主')
第二種:
from threading importthread
import
time
class
mythread(thread):
def__init__
(self, name):
super().
__init__
() self.name =name
defrun(self):
print("
%s is running
" %self.name)
time.sleep(1)
print("
%s is done
" %self.name)
t1 = mythread('
mr hello')
t1.start()
t1.join()
print('
zhuzhuzhu
')
二、執行緒之間的資料共享
前面我們學到程序的時候知道程序與程序之間記憶體空間是相互隔離的,互相無法直接訪問到,那麼執行緒之間的共享呢
下面通過一段**來看看資料直接是否共享:
from threading importthread
x= 99
deftask():
global
x x = 66t1 = thread(target=task) #
建立子執行緒物件
t1.start() #
向作業系統傳送子執行緒執行請求
t1.join() #
子執行緒完畢後才往下走,此時子程序已經執行了x = 66,如果最終列印
#的是99,則代表子程序無法修改主程序中的x,如果是66則子程序與主程序公共一記憶體空間,可以修改
print(x) #
結果為66,證明公用乙個記憶體空間
可以看到,執行緒之間的資料時具有共享性的,所以就會存在乙個隱患,當多個執行緒同時併發操作同一資料時候或者執行同一**的時候在某種場景下會導致混亂。
這就是我們後面學到的gil(global interpreter lock)全域性直譯器鎖的必要性的原因。在這裡先提一下。
三、執行緒的互斥鎖:
執行緒的互斥鎖,同理程序的互斥鎖,作用也是為了保證資料的安全,何種情況:多執行緒同時訪問操作同一資料時候
先產生鎖,再在運算元據的那段**前後加鎖,操作完畢釋放鎖。實現方法:
from threading importthread, lock
import
time
import
random
import
json
mutex =lock() # 建立鎖
class
mythread(thread):
def__init__
(self, name):
super().
__init__
() self.name =name
defrun(self):
time.sleep(0.5) #保證多執行緒同一時間搶鎖,睡個0.5秒,等待大部分執行緒都能執行到此處,開始搶鎖
mutex.acquire() # 加鎖
with open(
'info
', '
r', encoding='
utf-8
') as f1: # 簡單模擬搶票過程
dic =json.load(f1)
num = dic.get('
remain')
#time.sleep(random.randint(1, 5))
print('
剩餘票數:%s
' %num)
ifnot
num:
print('
票已售完,%s購票失敗
' %self.name)
else
: dic[
'remain
'] -= 1
#time.sleep(random.randint(1, 5))
with open('
info
', '
w', encoding='
utf-8
') as f2:
json.dump(dic, f2)
print('
使用者%s購票成功!
' %self.name)
mutex.release() # 釋放鎖,這裡注意釋放位置
user2 = mythread('
egon')
user3 = mythread('
jason')
user1 = mythread('
alex')
user2.start()
user3.start()
user1.start()
user1.join()
user2.join()
user3.join()
print('
歡迎歡迎
')
python執行緒喚醒 Python中的執行緒
執行緒同步 概念執行緒同步,執行緒間協同,通過某種技術,讓乙個執行緒訪問某些資料時,其他執行緒不能訪問這些資料,直到該執行緒完成對資料的操作.臨界區 critical section 互斥量 mutex 訊號量 semaphore 時間 event event事件 event事件,是執行緒間通訊機制...
python中的執行緒
執行緒是作業系統中能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。好處 1 易於排程。2 提高併發性。通過執行緒可方便有效地實現併發性。程序可建立多個執行緒來執行同一程式的不同部分。3 開銷少。建立執行緒比建立程序要快,所需開銷很少 1.多執行緒之間共享資料時存在資源競爭問題...
python中的執行緒
執行緒的理解應該結合程序來對比理解更直接 如果我們作業系統當做乙個工廠的話,那麼建立乙個程序就相當於在這個工廠裡面新增了乙個車間,車間裡面存放了很多資源,而車間要執行起來很顯然的標誌就是流水線,而這些流水線就是執行緒,可以說執行緒是執行 的最小單位。而執行緒和程序兩者在使用層面上有很大的相似性,所以...