<div class="iteye-blog-content-contain" style="font-size: 14px"><p><div id="cnblogs_post_body"></p>
<p> <p>通过下面一个例子进行理解。</p> </p>
<p> <div class="cnblogs_code"> </p>
<p> <pre><span style="color: #0000ff">from</span> multiprocessing <span style="color: #0000ff">import</span><span style="color: #000000"> Process</p>
<p></span><span style="color: #0000ff">from</span> multiprocessing <span style="color: #0000ff">import</span><span style="color: #000000"> Semaphore</p>
<p></span><span style="color: #0000ff">import</span><span style="color: #000000"> datetime</p>
<p></span><span style="color: #0000ff">import</span><span style="color: #000000"> time</p>
<p></span><span style="color: #0000ff">import</span><span style="color: #000000"> multiprocessing</p>
<p> </p>
<p></span><span style="color: #0000ff">def</span><span style="color: #000000"> worker(s, i):</p>
<p> s.acquire()</p>
<p> </span><span style="color: #0000ff">print</span>(multiprocessing.current_process().name + <span style="color: #800000">&quot;</span><span style="color: #800000"> acquire</span><span style="color: #800000">&quot;</span><span style="color: #000000">,datetime.datetime.now())</p>
<p> time.sleep(i)</p>
<p> </span><span style="color: #0000ff">print</span>(multiprocessing.current_process().name + <span style="color: #800000">&quot;</span><span style="color: #800000"> release</span><span style="color: #800000">&quot;</span>,datetime.datetime.now(),<span style="color: #800000">&quot;</span><span style="color: #800000">\n</span><span style="color: #800000">&quot;</span><span style="color: #000000">)</p>
<p> s.release()</p>
<p> </p>
<p></span><span style="color: #0000ff">if</span> <span style="color: #800080">__name__</span> == <span style="color: #800000">&quot;</span><span style="color: #800000">__main__</span><span style="color: #800000">&quot;</span><span style="color: #000000">:</p>
<p> s </span>= multiprocessing.Semaphore(2<span style="color: #000000">)</p>
<p> </span><span style="color: #0000ff">for</span> i <span style="color: #0000ff">in</span> range(5<span style="color: #000000">):</p>
<p> p </span>= multiprocessing.Process(target = worker, args=(s, i*2<span style="color: #000000">))</p>
<p> p.start()</span></pre> </p>
<p> </div> </p>
<p> <p>运行结果:</p> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <img alt="" data-media-type="image" data-attr-org-src-id="864F8CD1AAAB4237A6FEBE704AE959E2" /></p>
<p> <img src="http://images2017.cnblogs.com/blog/1255548/201711/1255548-20171120232934790-2105426550.png" alt="" /></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px; text-align: left"></p>
<p> 分析:</p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">p = multiprocessing.Process(……)定义了五个进程,p.start五个进程并行,造成如图的结果是信号量原因。</span></p>
<p> </div> </p>
<p> <div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">s = multiprocessing.Semaphore(2)定义了信号量最大为2,release: +1 acquire: -1</span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">22:41:30</span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">第一步,五个进程并发执行,进程1执行并等待0s,S-1=1</span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">第二步,五个进程并发执行,进程2执行并等待2s,S-1=0</span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">第三步,因为进程1执行了,并且等待时间为0,而进程2需要等待2s。所以这步必定是进程1执行,并且进程1执行完毕,而信号量+1且进入非堵塞。</span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">第四步,进程2进入等待2s,所以只剩下三个进程3、4、5并行,进程4执行并等待6s,S-1=0</span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">22:41:32</span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">第五步,进程2等待2s完毕,进程2执行,S+1=1</span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">第六步,进程4等待中,只剩下两个进程3、5并行,进程3执行并等待4s,S-1=0</span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px"><span style="font-size: 12px">22:41:36</span></span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">第七步,进程4等待的是6s,进程3是4s,所以进程3执行,S+1=1</span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">第八步,进程4等待,进程5执行并等待8s,S-1=0</span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">第九步,进程4执行,S+1=1</span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px"><span style="font-size: 12px">22:41:44</span></span></p>
<p> </div> </p>
<p> <div style="white-space: pre-wrap; text-indent: 56px; line-height: 1.75; font-size: 14px"></p>
<p> <span style="font-size: 12px">第十步,进程5执行,S-1=0</span></p>
<p> </div> </p>
<p> </div> </p>
<p> <div></p>
<p> <img alt="" data-media-type="image" data-attr-org-src-id="864F8CD1AAAB4237A6FEBE704AE959E2" /></p>
<p> </div></p>
<p></div></p></div>
多进程+信号量Semaphore
猜你喜欢
转载自right-left.iteye.com/blog/2406713
今日推荐
周排行