Я считаю, что это должно быть полезно. Поместите запрос на получение блокировки в двух местах: один перед функцией, где выбираются кадры, и один после проверки условия, если очередь заполнена.
После того, как вы проверите, что очередь заполнена, и вы получили блокировку, вы можете снова проверить условие, заполнено ли оно по-прежнему или нет. В отношении этого условия вы можете решить, вызывать функцию 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