通過下面一個例子進行理解。
from multiprocessing import Process from multiprocessing import Semaphore import datetime import time import multiprocessing def worker(s, i): s.acquire() print(multiprocessing.current_process().name + " acquire",datetime.datetime.now()) time.sleep(i) print(multiprocessing.current_process().name + " release",datetime.datetime.now(),"\n") s.release() if __name__ == "__main__": s = multiprocessing.Semaphore(2) for i in range(5): p = multiprocessing.Process(target = worker, args=(s, i*2)) p.start()
運行結果:


分析:
p = multiprocessing.Process(……)定義了五個進程,p.start五個進程並行,造成如圖的結果是信號量限制進程對臨界資源的訪問的原因。
s = multiprocessing.Semaphore(2)定義了信號量最大為2,release: +1 acquire: -1
22:41:30
第一步,五個進程並發執行,進程1執行並等待0s,S-1=1
第二步,五個進程並發執行,進程2執行並等待2s,S-1=0
第三步,因為進程1執行了,並且等待時間為0,而進程2需要等待2s。所以這步必定是進程1執行,並且進程1執行完畢,而信號量+1且進入非堵塞。
第四步,進程2進入等待2s,所以只剩下三個進程3、4、5並行,進程4執行並等待6s,S-1=0
22:41:32
第五步,進程2等待2s完畢,進程2執行,S+1=1
第六步,進程4等待中,只剩下兩個進程3、5並行,進程3執行並等待4s,S-1=0
22:41:36
第七步,進程3和4等待時間同時結束,進程3爭奪並臨界資源執行,S+1=1
第八步,進程4等待,進程5執行並等待8s,S-1=0
第九步,進程4執行,S+1=1
22:41:44
第十步,進程5執行,S+1=1
參考:http://www.cnblogs.com/kaituorensheng/p/4445418.html