Является ли поведение блокировки без исключения намеренным намерением? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть небольшой серверный скрипт, зеркалирующий трафик Интернета вещей 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, освобождая блокировку. Исключение перехватывается ниже по потоку.

Раньше я избегал подобных вещей. Считается ли это «разумным дизайном» или снятие блокировки с помощью исключения является своего рода хакерством, которого следует избегать?

1 Ответ

0 голосов
/ 05 августа 2020

Да нормально. with операторы всегда запускаются __exit__ для исключений, по дизайну, например try…finally.

...