提前設定好,乙個房間只有4個床(計數器現在為4),那麼同時只能四個人進來,誰先來的誰先佔乙個床(acquire,計數器減1),4個床滿了之後(計數器為0了),第五個人就要等著,等其中乙個人出來(release,計數器加1),他就去占用那個床了。
互斥鎖同時只允許乙個執行緒更改資料,而訊號量semaphore是同時允許一定數量的執行緒更改資料 。假設商場裡有4個迷你唱吧,所以同時可以進去4個人,如果來了第五個人就要在外面等待,等到有人出來才能再進去玩。
實現:訊號量同步基於內部計數器,每呼叫一次acquire(),計數器減1;每呼叫一次release(),計數器加1.當計數器為0時,acquire()呼叫被阻塞。這是迪科斯徹(dijkstra)訊號量概念p()和v()的python實現。訊號量同步機制適用於訪問像伺服器這樣的有限資源。
訊號量與程序池的概念很像,但是要區分開,訊號量涉及到加鎖的概念
#-*- coding: utf-8 -*-
import
osimport
time
from multiprocessing import
process
defgo_ktv(i):
print("
user%s正在....ktv.子程序(%s)
" %(i, os.getpid()))
time.sleep(2)
if__name__ == '
__main__':
'''開啟20個程序,作業系統可以排程4個cpu去執行,程序的呼叫比執行緒的開銷大些
'''start_time =time.time()
p_lst =
for i in range(20):
p = process(target=go_ktv, args=(i,))
p.start()
[pp.join()
for pp in
p_lst]
print("
" % ((time.time() -start_time), os.getpid()))
#user0正在....ktv.子程序(5496)
#user1正在....ktv.子程序(6996)
#user3正在....ktv.子程序(6328)
#user2正在....ktv.子程序(1064)
#user4正在....ktv.子程序(4844)
#user7正在....ktv.子程序(7804)
#user5正在....ktv.子程序(7688)
#user8正在....ktv.子程序(7136)
#user6正在....ktv.子程序(7824)
#user9正在....ktv.子程序(7812)
#user10正在....ktv.子程序(8148)
#user11正在....ktv.子程序(2556)
#user13正在....ktv.子程序(4744)
#user15正在....ktv.子程序(6232)
#user14正在....ktv.子程序(5168)
#user16正在....ktv.子程序(6444)
#user12正在....ktv.子程序(2616)
#user17正在....ktv.子程序(5188)
#user18正在....ktv.子程序(8088)
#user19正在....ktv.子程序(7224)
#
#-*- coding: utf-8 -*-
import
osimport
time
from multiprocessing import
pool
defgo_ktv(i):
print("
user%s正在....ktv.子程序(%s)
" %(i, os.getpid()))
time.sleep(2)
if__name__ == '
__main__':
'''建立程序池,程序的容量預設是4,
如果總程序的數量超過4,就會自動排隊等待,一次可執行4個程序,程序池內的程序結束乙個,就會自動進來乙個新的程序,重用原來的程序號,節省開銷
'''start_time =time.time()
pool =pool()
p_lst =
for i in range(20):
pool.close()
pool.join()
print("
" % ((time.time() -start_time), os.getpid()))
#user0正在....ktv.子程序(7396)
#user1正在....ktv.子程序(1760)
#user2正在....ktv.子程序(8000)
#user3正在....ktv.子程序(4120)
#user4正在....ktv.子程序(7396)
#user5正在....ktv.子程序(1760)
#user6正在....ktv.子程序(8000)
#user7正在....ktv.子程序(4120)
#user8正在....ktv.子程序(7396)
#user9正在....ktv.子程序(1760)
#user10正在....ktv.子程序(8000)
#user11正在....ktv.子程序(4120)
#user12正在....ktv.子程序(7396)
#user13正在....ktv.子程序(1760)
#user14正在....ktv.子程序(8000)
#user15正在....ktv.子程序(4120)
#user16正在....ktv.子程序(7396)
#user17正在....ktv.子程序(1760)
#user18正在....ktv.子程序(8000)
#user19正在....ktv.子程序(4120)
#
#-*- coding: utf-8 -*-
import
osimport
time
from multiprocessing import
process, semaphore
defgo_ktv(i, sem):
with sem:
print("
user%s正在....ktv.子程序(%s)
" %(i, os.getpid()))
time.sleep(2)
if__name__ == '
__main__':
'''開啟20個程序,一次可執行4(訊號量容量)個程序,相當於新增另乙個互斥鎖
'''start_time =time.time()
sem = semaphore(4)
p_lst =
for i in range(20):
p = process(target=go_ktv, args=(i, sem))
p.start()
[pp.join()
for pp in
p_lst]
print("
" % ((time.time() -start_time), os.getpid()))
#user0正在....ktv.子程序(3660)
#user1正在....ktv.子程序(7188)
#user3正在....ktv.子程序(7268)
#user2正在....ktv.子程序(7568)
#user5正在....ktv.子程序(2896)
#user6正在....ktv.子程序(2852)
#user7正在....ktv.子程序(376)
#user4正在....ktv.子程序(7532)
#user9正在....ktv.子程序(8188)
#user10正在....ktv.子程序(1444)
#user12正在....ktv.子程序(6304)
#user11正在....ktv.子程序(6776)
#user14正在....ktv.子程序(6992)
#user13正在....ktv.子程序(7248)
#user8正在....ktv.子程序(6820)
#user17正在....ktv.子程序(6308)
#user15正在....ktv.子程序(8020)
#user18正在....ktv.子程序(4312)
#user16正在....ktv.子程序(2724)
#user19正在....ktv.子程序(7516)
#
python 程序訊號量
1 概念 訊號量和鎖相似,鎖同一時間只允許乙個物件 程序 通過,訊號量同一時間允許多個物件 程序 通過 2 應用場景 多執行緒,並規定數量 3 格式 匯入訊號量模組 例項化訊號量物件,可以規定訊號量的個數 傳遞物件 拿到一把鑰匙 釋放一把鑰匙 4 過程 獲得鑰匙,當鑰匙串沒鑰匙時,其它程序要在外面等...
python訊號量 Python訊號量
python訊號量教程 訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而 python訊號量與互斥鎖的關係 訊號量的乙個特殊用...
程序間通訊 3 訊號量
目錄 1.前言 2.訊號量 3.訊號量集結構 4.建立訊號量semget 5.改變訊號量值semop 6.控制訊號量semctrl 本文章中所有例子,基於rhel6.5。訊號量是一種用於提供不同程序間或乙個程序間的不同執行緒間進行同步手段的原語,system v訊號量在核心中維護。二值訊號量 其值只...