Python: существует ли поточно-безопасная версия очереди?

У меня есть многопоточная программа, состоящая из класса Consumer и класса Producer. В настоящее время я использую Fifo queue.Queue в реализации, где производитель putс данными в конце очереди, а потребитель getс ними.

Тем не менее, я хотел бы добавить функцию, при которой, при необходимости, Consumer может put вернуть (возможно, слегка измененный) элемент, который он gets, поместив обратно перед Queue (так что следующий элемент, возвращенный get, будет только что добавленный элемент, как в стеке).

Я знаю, что это возможно с deques, но я прочитал здесь что они потокобезопасны только для append() и popleft(). Для вышеуказанных целей мне также потребуется использовать appendleft().

Существует ли потокобезопасная структура данных, имеющая функции deque? Если нет, могу ли я сделать deque потокобезопасным, установив свои собственные блокировки всякий раз, когда я использую appendleft?


person Victor Odouard    schedule 08.09.2017    source источник


Ответы (2)


Автор дека здесь.

  • Все интересующие вас операции атомарны.
  • Единственными неатомарными операциями являются: remove(), index(), count и clear(). из-за тестов на равенство, которые могут выполнять обратные вызовы на чистом python, или из-за decrefs, которые могут запускать произвольный код python.

Надеюсь это поможет :-)

person Raymond Hettinger    schedule 03.11.2019

Хотя некоторые функции deque не являются потокобезопасными, то, что вы пытаетесь сделать, должно быть безопасным.

Из документов:

Двухсторонние очереди поддерживают потокобезопасные, эффективные с точки зрения памяти добавления и извлечения с любой стороны двухсторонней очереди.

person fantabolous    schedule 03.10.2019