Я тестирую несколько очередей. В моем тесте используется простой класс с геттером и сеттером, охватывающий несколько очередей.
Мой тест чередуется между проходом и неудачей при повторном запуске 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"]






Это не проблема с pytest. За кулисами очереди творится больше, чем вы думаете.
Если вы установите block=True в своем геттере, это должно решить проблему.
Добавление оператора while True все меняет. Теперь он блокируется, потому что вы вызываете get () с пустой Очередью, которую вы не закрыли. В вашем примере не учитывается какой-то код, который использует пул процессов?
Фактическая программа получает сообщения от другого процесса. Я нигде не использую пул процессов. В моем тесте я не запускаю второй процесс.
У вас могут быть слишком завышенные ожидания от многопоточности Python. Документация дает мало гарантий. Когда вы вызываете "put", значение не сразу становится доступным для "get", поэтому вам нужен блокирующий вызов. Я не уверен на 100% в том, что вам нужно здесь, но просмотр реализации CPython может помочь: github.com/python/cpython/blob/master/Lib/multiprocessing/…
В документах говорится, что multiprocess.queue.get (block = True) будет ждать, пока не появится значение. Мне просто нужно проверить очередь и двигаться дальше, нет ли там ничего нового. Должен ли я делать что-то по-другому?
Спасибо. В этом примере я не учел тот факт, что я получаю несколько элементов из очереди. Использование block = True останавливает мою программу. Я обновил фрагмент, чтобы отразить это