2012-01-19 1 views
2

マルチスレッドとは、通常、クリティカルセクションのロックなどを意味します。シングルスレッドプログラムやマルチスレッドプログラムではキューがちょうど特定のスレッドで使用されていますが、不要な)オーバーヘッドのロックタイプ?キューのマルチスレッドサポートは、1つのスレッドだけで使用してもオーバースレッドを表示しますか?

たとえば、putやgetやqsizeなどを呼び出すと、ロックされてから処理が行われ、ロックが解除されます。

答えて

1

ロックは、キュークラスにハードコードされています。したがって、メソッドput,getは、プログラムにいくつのスレッドが存在していてもロックを使用します。キューは、スレッド間の通信を容易にするために使用されるモジュールです。

チェックQueue.pyの実装

class Queue: 
    def __init__(self, maxsize=0): 
     ... 
     self.mutex = threading.Lock() 
     self.not_empty = threading.Condition(self.mutex) 
     self.not_full = threading.Condition(self.mutex) 
     self.all_tasks_done = threading.Condition(self.mutex) 
     self.unfinished_tasks = 0 

とそのput方法:

def put(self, item, block=True, timeout=None): 
    ... 
    self.not_full.acquire() 
    try: 
     if self.maxsize > 0: 
      ... 
      elif timeout is None: 
       while self._qsize() == self.maxsize: 
        self.not_full.wait() 
     self._put(item) 
     self.unfinished_tasks += 1 
     self.not_empty.notify() 
    finally: 
     self.not_full.release() 

私はこれがあなたの質問に答える願っています。

UPDATE

さえ方法qsizeは、ロックを使用しています。

def qsize(self): 
    """Return the approximate size of the queue (not reliable!).""" 
    self.mutex.acquire() 
    n = self._qsize() 
    self.mutex.release() 
    return n 

はFYI、私はPython2.7

1

はい - いくらかオーバーヘッドが発生することはありません。キューは、それが1つのスレッドでのみ使用されることを知る方法がありません!

+0

ためQueue.pyの実装を確認しかし、誰競合がパスがありますしない場合があることに注意してくださいロックの取得と解放は非常に高速です...すでにPython GILを入手してリリースするのにもっと時間を費やしているでしょう! –

1

未使用のロックの取得と解放は、最新のハードウェアでは非常に安価です。これは、ハードウェア設計者が最初に行うことの1つです。これは、大部分のロック操作が競合していないロック上にあるためです。

3

Queue.Queue implements lockingcollections.dequeQueue.Queueを1つのスレッドでのみ使用する場合は、collections.dequeに置き換えることができます。

関連する問題