1

非常に単純なマルチスレッドモデルをまとめようとしましたが、これまでのところうまくいくようです。私の質問は、2つのスレッドがキューから同じ値を同時に取得して、繰り返しを与えないようにするにはどうすればよいですか?これを防ぐ組み込みのメソッドはありますか?各スレッドがキューから値を取得するまでの時間を置くために遅延を追加しましたが、これは必要ですか?

from Queue import Queue
from threading import Thread
import time

class myThread(Thread):
    def __init__(self,queue):
        Thread.__init__(self)
        self.queue = queue
    def run(self):       
        while True:                      
            time.sleep(0.0001)   #not sure if this is good enough to compensate for overlap in pulling the same value out of a queue         
            task = self.queue.get() #pull a number from the queue,
            if task != None:          
                out.append(task) #This will be where you        
            else:               
                break


queue = Queue()
out = []


for i in range(10):
    t = myThread(queue)
    t.start()
for i in range(100):
    queue.put(i)
print out
4

3 に答える 3

3

Queueクラスは、これが発生しないようにロックを実装します。特にhttp://docs.python.org/library/queue.htmlを参照してください。

これは、情報を複数のスレッド間で安全に交換する必要があるスレッドプログラミングで特に役立ちます。このモジュールのQueueクラスは、必要なすべてのロックセマンティクスを実装します。

したがって、遅延は必要ありません。キューは希望どおりに機能するはずです。それはそれが(基本的に)書かれたものです:-)

于 2012-05-29T23:12:39.353 に答える
2

あなたのコードは正しいです。睡眠は必要ありません。キューは同期です。同じタスクをプルするスレッドを回避するロックが存在します。

于 2012-05-29T23:37:00.643 に答える
1

queue.Queueの要点は、このプロパティを保証することです。スリープは必要ありません(そして、スリープは並行性の不具合を回避する良い方法ではありません)。

于 2012-05-29T23:14:08.103 に答える