14

qsize()のドキュメントには、次のように記載されています。キューのおおよそのサイズを返します。

このキューの正確なサイズを返すことができないのはなぜですか?キューは複数のスレッドからアクセスされる可能性があることは理解していますが、関数を呼び出した時点では、その瞬間の正確なサイズを返すことはまだ可能だと思います。

4

2 に答える 2

36

それは、他のスレッドがそれにアクセスしているからです。qsize()から取得したサイズを使用しようとするときまでに、キューが変更されている可能性があります。ドキュメントが次のようになっているとよいでしょう。

キューのサイズを返します。マルチスレッド環境では、サイズはいつでも変更される可能性があるため、これは実際のサイズの概算にすぎないことに注意してください。

于 2012-07-21T11:58:52.490 に答える
5

t1「おおよそ」という言葉が最も明確な選択ではないことに同意しますが、ネッドが述べているように、当時のキューのサイズが7だったからといって、プッシュしたときにまだサイズ7になるわけではないことを指摘しようとしています。または後で値をポップします。

問題は、qsizeから返されるサイズが、そのキューから値をプッシュ/ポップするときにまだ正しいと仮定すると、マルチスレッド環境で予期しない動作をする可能性があることです。

例えば:

q = Queue()
if q.qsize > 0: # size is 1 here
    # another thread runs here and gets an item from your queue
    # this get fails and throws an exception in your thread:
    item = q.get(False)
    # do whatever processing with item you need to do

これはLBYLの「飛躍する前に見る」の例であり、複数のスレッドがキューにアクセスしているときに競合状態が発生する可能性があるため、危険です。

この場合、EAFPまたは「許可よりも許しを求めるのが簡単」を支持し、次のことを行う必要があります。

from Queue import Queue, Empty
import time
q = Queue()
try:
    item = q.get(False)
    # do whatever processing with item you need to do 
except Empty:
    time.sleep(1)
于 2012-07-21T12:33:33.617 に答える