通過下麵一個例子進行理解。 運行結果: 分析: p = multiprocessing.Process(……)定義了五個進程,p.start五個進程並行,造成如圖的結果是信號量限制進程對臨界資源的訪問的原因。 s = multiprocessing.Semaphore(2)定義了信號量最大為2,re ...
通過下麵一個例子進行理解。
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