擅长:python、mysql、java
<p>看起来您想要一个<a href="http://docs.python.org/library/threading.html?highlight=threading%20event#semaphore-objects" rel="nofollow noreferrer">threading.Semaphore</a>与每个处理程序相关联(其他同步对象,如事件和条件,也可以,但信号量对于您的需要来说似乎最简单)。(具体地说,在您的用例中使用<a href="http://docs.python.org/library/threading.html?highlight=threading%20event#threading.BoundedSemaphore" rel="nofollow noreferrer">BoundedSemaphore</a>:对于错误地释放信号电话的次数多于获取次数的编程错误,这将立即引发异常——这正是产生有界信号电话版本的原因;-)。</p>
<p>在构建每个信号量时,将其初始化为<code>1</code>的值(这意味着处理程序可用)。每一个使用线程调用信号量上的<code>acquire</code>来获取处理程序(可能会阻塞它),并在处理完处理程序后对其进行<code>release</code>(这将恰好取消阻塞一个等待的线程)。这比条件的获取/等待/通知/发布生命周期更简单,也更能证明未来,因为正如条件文档所说:</p>
<blockquote>
<p>The current implementation wakes up
exactly one thread, if any are
waiting. However, it’s not safe to
rely on this behavior. A future,
optimized implementation may
occasionally wake up more than one
thread.</p>
</blockquote>
<p>当使用一个信号量时,您可以安全地使用它(其中<em>的语义是</em>可以安全依赖的:如果一个信号量被初始化为N,则始终有0到N-1[[included]]个线程成功地获取了该信号量,但尚未释放它)。</p>