質問

どうやら

import Queue

Queue.Queue().get(timeout=10)

キーボード割り込み可能(ctrl-c)に対し、

import Queue

Queue.Queue().get()

ではありません。常にループを作成できました;

import Queue
q = Queue()

while True:
    try:
        q.get(timeout=1000)
    except Queue.Empty:
        pass

しかし、これは奇妙なことのように思えます。

では、無期限に待機するがキーボードで割り込み可能なQueue.get()を取得する方法はありますか?

役に立ちましたか?

解決

Condition オブジェクトは threading モジュールを使用してロックするため、

Queue オブジェクトにはこの動作があります。そのため、あなたのソリューションが本当に唯一の方法です。

ただし、これを行う Queue メソッドが本当に必要な場合は、 Queue クラスをモンキーパッチできます。例:

def interruptable_get(self):
    while True:
        try:
            return self.get(timeout=1000)
        except Queue.Empty:
            pass
Queue.interruptable_get = interruptable_get

これはあなたに言うことができます

q.interruptable_get()

の代わりに

interruptable_get(q)

モンキーパッチは通常、これらのようなケースではPythonコミュニティによって推奨されていません。通常の関数は同じように思えるからです。

他のヒント

これは、ユースケースにはまったく適用されない場合があります。しかし、私はこのパターンをいくつかのケースで成功裏に使用しました。

STOP = object()

def consumer(q):
    while True:
        x = q.get()
        if x is STOP:
            return
        consume(x)

def main()
    q = Queue()
    c=threading.Thread(target=consumer,args=[q])

    try:
        run_producer(q)
    except KeybordInterrupt:
        q.enqueue(STOP)
    c.join()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top