擅长:python、mysql、java
<p>有两件事。首先,从设计的角度来看,<code>execute</code>标志在类级别有点奇怪。通常最好在每个类的实例上设置一个标志。在</p>
<p>第二,你有比赛条件。<code>execute</code>标志由多个线程访问,不受同步原语(如互斥锁)的保护。这意味着<code>terminate()</code>调用可以在</em>之后运行(并设置标志)<em>,任何工作线程都会检查该标志,但在</em>之前,该线程会尝试将下一个文件名出列。因为您没有超时地调用<code>get()</code>,所以工作线程将挂在这里,主线程将在<code>t.join()</code>调用中阻塞。僵局接踵而至。在</p>
<p>有很多方法可以解决这个问题。可以使用线程同步原语(如互斥体)来保护<code>execute</code>标志,也可以使用<code>threading.Event</code>对象来代替简单的布尔值。在</p>
<p>另一个在我看来更简单的解决方案是在同一个队列上发送一个“sentinel”值,这表示线程应该退出。看起来您发送的是字符串文件名,因此空字符串可能是一个不错的选择。(<code>None</code>也常用。)</p>
<p>现在每个线程的工作循环如下所示:</p>
<pre><code>def run(self):
while True:
self.filename = self.fileQueue.get()
if self.filename == '':
return
# Process file
</code></pre>
<p>主线程不是<code>terminate()</code>静态方法,而是为每个工作线程放置一个空字符串(即<code>fileQueue.enqueue('')</code>)。在</p>