多进程+信号量Semaphore

Posted 默不知然

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多进程+信号量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

以上是关于多进程+信号量Semaphore的主要内容,如果未能解决你的问题,请参考以下文章

C 语言编程 — semaphore 信号量操作

python多线程-Semaphore(信号对象)

Golang基于redis实现的分布式信号量(semaphore)

Java 信号量 Semaphore 介绍

java中的信号量Semaphore

iOS底层探索之多线程—GCD源码分析( 信号量dispatch_semaphore_t)