多進程+信號量Semaphore


通過下面一個例子進行理解。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM