多进程+信号量Semaphore

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

猜你喜欢

转载自right-left.iteye.com/blog/2406713