Pythonのキーボード割り込み可能ブロッキングキュー
-
03-07-2019 - |
質問
どうやら
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()
所属していません StackOverflow