Получите все объекты от Очереди потока

Добавьте фильтр Данные графика , выбрав data.csv, и нажмите Применить . Откроется линейная диаграмма , но ничего не отобразится. На панели Свойства прокрутите вниз до подраздела Параметры серии . Нажмите на флажок слева от переменной «Y». Чтобы поставить «X» на оси x, снимите флажок Использовать индекс для XAxis и установите X Array Name на «X».

14
задан Eli Bendersky 1 October 2008 в 08:57
поделиться

3 ответа

Я был бы очень удивлен, вызвал ли get_nowait() вызов паузу, не возвратившись, если список был пуст.

могло случиться так регистрацией большого количества (возможно, большой?) объекты между проверками, который означает поток получения, имеют большой объем данных для выхода Queue? Вы могли попытаться ограничить число, которое Вы получаете в одном пакете:

def queue_get_all(q):
    items = []
    maxItemsToRetreive = 10
    for numOfItemsRetrieved in range(0, maxItemsToRetreive):
        try:
            if numOfItemsRetrieved == maxItemsToRetreive:
                break
            items.append(q.get_nowait())
        except Empty, e:
            break
    return items

Это ограничило бы поток получения получением по запросу до 10 объектов за один раз.

9
ответ дан 1 December 2019 в 07:20
поделиться

Я вижу, что Вы используете get_nowait (), который согласно документации, "возврат [s] объект, если Вы сразу доступны, еще повышает Пустое исключение"

Теперь, Вы, оказывается, убегаете из цикла, когда Пустое исключение выдается. Таким образом, если нет никакого результата, сразу доступного в очереди, Ваша функция возвращает пустой список объектов.

там причина, почему Вы не используете получение () метод вместо этого? Может иметь место, что get_nowait () перестал работать, потому что очередь обслуживает помещенный () запрос в тот же самый момент.

1
ответ дан 1 December 2019 в 07:20
поделиться

Если Вы всегда вытягиваете все доступные объекты от очереди, есть ли какое-либо основное назначение в использовании очереди, а не просто списка с блокировкой? т.е.:

from __future__ import with_statement
import threading

class ItemStore(object):
    def __init__(self):
        self.lock = threading.Lock()
        self.items = []

    def add(self, item):
        with self.lock:
            self.items.append(item)

    def getAll(self):
        with self.lock:
            items, self.items = self.items, []
        return items

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

[Edit2] я пропустил то, что Вы опрашиваете очередь от неактивного цикла, и от Вашего обновления, я вижу, что проблема не связана с конкуренцией, таким образом, ниже подхода не действительно относится к Вашей проблеме. Я оставил его внутри в случае, если любой находит блокирующийся вариант этого полезным:

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

class ItemStore(object):
    def __init__(self):
        self.cond = threading.Condition()
        self.items = []

    def add(self, item):
        with self.cond:
            self.items.append(item)
            self.cond.notify() # Wake 1 thread waiting on cond (if any)

    def getAll(self, blocking=False):
        with self.cond:
            # If blocking is true, always return at least 1 item
            while blocking and len(self.items) == 0:
                self.cond.wait()
            items, self.items = self.items, []
        return items
16
ответ дан 1 December 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: