Принудительно поставить в очередь python, даже когда заполнен - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть поток, который читает кадры для веб-камеры и помещает их в очередь. Затем другой поток читает кадры по мере необходимости.

Моя проблема заключается в том, что я хочу сохранить самые последние кадры в очереди, даже если поток потребителя не может идти в ногу.

Я могу сделать следующее в кадры очереди потока:

if q.full():
    drop = q.get()

q.put(new_frame)

Но я думаю, что это может не сработать.

  1. Если очередь была заполнена, когда вызывался full(), но затем потребитель выбирает кадры, производитель будет отбрасывать кадр без причины.

  2. Если очередь была заполнена при вызове full(), тогда потребитель выбирает все кадры из очереди, производитель будет заморозить на q.get (). По сути, взлом приложения.

В моем случае, использование threading.Lock с простым списком - это путь к go?

1 Ответ

0 голосов
/ 24 февраля 2020

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

После того, как вы проверите, что очередь заполнена, и вы получили блокировку, вы можете снова проверить условие, заполнено ли оно по-прежнему или нет. В отношении этого условия вы можете решить, вызывать функцию get или нет.

Thread 1:
if q.full():
    // acquire lock
    if q.full():
        drop = q.get()
    else:
        q.put(new_frame)
    // release lock
else:
    q.put(new_frame)
Thread 2:
if not q.empty():
    //acquire lock
    q.get()
    // release lock
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...