У меня есть небольшой серверный скрипт, зеркалирующий трафик Интернета вещей c и обрабатывающий несколько типов пакетов. Там у меня есть вещи в очередях, и извлечение из них организовано следующим образом:
def pull_from(service, ID):
with service.LOCK_A:
if not ID in service.queues:
service.queues[ID] = queue.Queue(35)
return service.queues[ID].get(timeout=2.5)
Здесь время ожидания истекает, например, через 2,5 секунды, а затем поднимает queues.Empty, освобождая блокировку. Исключение перехватывается ниже по потоку.
Раньше я избегал подобных вещей. Считается ли это «разумным дизайном» или снятие блокировки с помощью исключения является своего рода хакерством, которого следует избегать?