Как заставить этот поток ждать в очереди на выход? - PullRequest
7 голосов
/ 13 мая 2011

У меня есть две темы в моем приложении.Один, который помещает значения в Queue, и другой, который извлекает их из Queue и обрабатывает их.

Я сталкиваюсь с дилеммой при закрытии приложения.Поток, обрабатывающий элементы в Queue, застрял на:

item = request_queue.get() # this call blocks until an item is available

Единственное, что прервет поток, это если другой элемент добавлен в Queue - и так как основной поток не 'Если что-то добавить (потому что оно закрывается), приложение блокируется.

Итак ... как я могу поручить Queue.get() как-то вернуть, даже если на Queue?

ничего нет

Ответы [ 3 ]

9 голосов
/ 13 мая 2011

Ответ оказывается довольно простым. Выберите значение, которое было бы недопустимым для кода, который обрабатывает Queue (None идеально подходит для этого) и вставьте его в Queue. Затем обработайте поток обработки Queue, когда получите значение:

while True:

    item = request_queue.get()

    if item is None:
        break

    # process the Queue as per normal...
1 голос
/ 13 мая 2011

Поскольку блокирующий поток не является основным, вы также можете установить .daemon = True.

import time
import threading
from Queue import Queue

def getter(q):
    while True:
        print 'getting...'
        print q.get(), 'gotten'

def putter(q):
    for i in range(10):
        time.sleep(0.5)
        q.put(i)
        time.sleep(0.5)

q = Queue()
get_thread = threading.Thread(target=getter, args=(q,))
get_thread.daemon = True
get_thread.start()

putter(q)
0 голосов
/ 09 сентября 2016

Эта проблема все еще может возникать, если Queue.get () вызывается в главном потоке - поэтому ответ setDaemon (True) не является универсальным решением.

Например, этот скрипт не может быть остановлен с помощью Ctrl-C

#!/usr/bin/python
import Queue

theQ = Queue.Queue()
print "one thread getting from Queue"
print theQ.get()

Вместо того, чтобы устанавливать тайм-аут в Queue.get () и работать с исключениями, простое решение - сделать цикл ожидания, пока что-то не появится.Этот скрипт можно убить с помощью Ctrl-C

#!/usr/bin/python
import Queue
theQ = Queue.Queue()
print "one thread getting from Queue"
while theQ.empty():
    time.sleep(0.01) # or whatever value is appropriate for your event arrivals
print theQ.get()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...