多进程+信号量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
posted @ 2017-11-20 23:33  默不知然  阅读(2588)  评论(0编辑  收藏  举报