Python коллекция с максимальной длиной, которая блокирует при получении, но не по положению - PullRequest
0 голосов
/ 07 апреля 2020

Мне нужна коллекция FIFO (аналогично очереди, с настраиваемой max size), которая будет разделена между двумя потоками: writer thread и reader thread. writer поместит sh элементов в эту коллекцию, а reader будет читать их один за другим и работать с каждым из них (reader читает следующий элемент только после того, как он завершит работу над текущим)

Если reader недостаточно быстр и коллекция заполнена полностью (скажем, max size равно 10, а в коллекции уже 10 элементов, в то время как reader все еще занят работой над последним выбранным элементом), затем, когда writer пытается добавить sh другой элемент в коллекцию, я хочу, чтобы он отбросил самый старый элемент из коллекции и pu sh новый. Я не хочу, чтобы он блокировался до тех пор, пока reader не завершит работу над своим элементом и не выберет новый из коллекции для освобождения места, чтобы writer мог добавить элемент.

What I ' Мы пытались использовать встроенные структуры, такие как Queue и deque, но ни одна из них не является именно тем, что мне нужно: Queue блокирует put, если вы указываете max length, а deque не блокирует pop, он выдает исключение, если он пустой.

Так что мне в основном нужна структура данных, которая действует как Queue get и deque put с maxlen.

Есть ли какой-нибудь хороший способ добиться того, что мне нужно? Я знаю, что такого рода структура данных может быть реализована с использованием Lock -s и condition variable -s, но если для этого есть что-то встроенное, лучше использовать ее напрямую.

...