문제

보인다

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 객체는 사용하기 때문에이 동작이 있습니다 Condition 객체가 형성됩니다 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)

원숭이를 입자가 일반적으로 파이썬 커뮤니티에 의해 일반적으로 이와 같은 경우에 낙담하지만, 규칙적인 기능이 좋아 보이기 때문입니다.

다른 팁

사용 사례에는 전혀 적용되지 않을 수 있습니다. 그러나 여러 경우 에이 패턴을 성공적으로 사용했습니다.

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