マルチスレッドとは、通常、クリティカルセクションのロックなどを意味します。シングルスレッドプログラムやマルチスレッドプログラムではキューがちょうど特定のスレッドで使用されていますが、不要な)オーバーヘッドのロックタイプ?キューのマルチスレッドサポートは、1つのスレッドだけで使用してもオーバースレッドを表示しますか?
たとえば、putやgetやqsizeなどを呼び出すと、ロックされてから処理が行われ、ロックが解除されます。
マルチスレッドとは、通常、クリティカルセクションのロックなどを意味します。シングルスレッドプログラムやマルチスレッドプログラムではキューがちょうど特定のスレッドで使用されていますが、不要な)オーバーヘッドのロックタイプ?キューのマルチスレッドサポートは、1つのスレッドだけで使用してもオーバースレッドを表示しますか?
たとえば、putやgetやqsizeなどを呼び出すと、ロックされてから処理が行われ、ロックが解除されます。
ロックは、キュークラスにハードコードされています。したがって、メソッド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つです。これは、大部分のロック操作が競合していないロック上にあるためです。
Queue.Queue
implements locking約collections.deque
。 Queue.Queue
を1つのスレッドでのみ使用する場合は、collections.deque
に置き換えることができます。
ため
Queue.py
の実装を確認しかし、誰競合がパスがありますしない場合があることに注意してくださいロックの取得と解放は非常に高速です...すでにPython GILを入手してリリースするのにもっと時間を費やしているでしょう! –