12

そうみたいです

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() を取得する方法はありますか?

4

2 に答える 2

6

QueueConditionオブジェクトは、モジュールからオブジェクトを使用してロックするため、この動作をしthreadingます。したがって、あなたのソリューションは本当に唯一の方法です。

ただし、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 コミュニティは一般的にモンキーパッチをお勧めしません。

于 2008-10-17T17:01:03.880 に答える
4

これは、ユースケースにはまったく当てはまらない場合があります。しかし、私はいくつかのケースでこのパターンをうまく使っています:

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()
于 2008-10-19T17:40:36.280 に答える