Pytest + Multiprocessing Queue не работают вместе

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

Мой тест чередуется между проходом и неудачей при повторном запуске i [edit: это происходит при использовании block = False. Установка его на True, как рекомендовано, приводит к зависанию программы].

Как мне это переписать, чтобы

(1) очистить множественную очередь между выполнениями программы и (2) Прочитать все значения из очереди в методе .get ()?

import multiprocessing
import queue

class MyClass:
    def __init__(self):
        self.q = multiprocessing.Queue()
        self.results = []

    def put(self, x):
        self.q.put(x)

    def get(self):
        while True:
            try:
                self.results.append(self.q.get(block=True))
            except queue.Empty:
                break
        return self.results

    @pytest.fixture
    def wrapped_queue():
        yield MyClass()

    def test_multiprocessing_queue(wrapped_queue):
        wrapped_queue.put("a")
        wrapped_queue.put("b")
        result = wrapped_queue.get()
        assert result == ["a", "b"]
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
3 304
1

Ответы 1

Это не проблема с pytest. За кулисами очереди творится больше, чем вы думаете.

Если вы установите block=True в своем геттере, это должно решить проблему.

Спасибо. В этом примере я не учел тот факт, что я получаю несколько элементов из очереди. Использование block = True останавливает мою программу. Я обновил фрагмент, чтобы отразить это

GlaceCelery 20.10.2018 00:43

Добавление оператора while True все меняет. Теперь он блокируется, потому что вы вызываете get () с пустой Очередью, которую вы не закрыли. В вашем примере не учитывается какой-то код, который использует пул процессов?

Dane White 20.10.2018 01:09

Фактическая программа получает сообщения от другого процесса. Я нигде не использую пул процессов. В моем тесте я не запускаю второй процесс.

GlaceCelery 20.10.2018 01:12

У вас могут быть слишком завышенные ожидания от многопоточности Python. Документация дает мало гарантий. Когда вы вызываете "put", значение не сразу становится доступным для "get", поэтому вам нужен блокирующий вызов. Я не уверен на 100% в том, что вам нужно здесь, но просмотр реализации CPython может помочь: github.com/python/cpython/blob/master/Lib/multiprocessing/…

Dane White 20.10.2018 01:31

В документах говорится, что multiprocess.queue.get (block = True) будет ждать, пока не появится значение. Мне просто нужно проверить очередь и двигаться дальше, нет ли там ничего нового. Должен ли я делать что-то по-другому?

GlaceCelery 20.10.2018 01:44

Другие вопросы по теме