Выбор ответа Middle GIL, потоки и процессы обновлено

Производитель и потребитель

Вопрос

Какой инструмент стандартной библиотеки лучше подходит для передачи задач от потока-производителя нескольким потокам-потребителям?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: queue.Queue: потокобезопасная, с блокирующими get и put. queue.Queue внутри использует блокировки и условия, потребители спят на get() и просыпаются при появлении задачи, а maxsize даёт обратное давление.

Варианты ответа

  1. queue.Queue: потокобезопасная, с блокирующими get и putправильный ответ
  2. Обычный list с append и pop(0), операции атомарны под GIL
  3. collections.Counter со счётчиком задач на каждый поток
  4. Глобальная переменная с последней задачей и флагом готовности

Разбор

queue.Queue внутри использует блокировки и условия, потребители спят на get() и просыпаются при появлении задачи, а maxsize даёт обратное давление. Список без блокировок не даёт ожидания и сигнализации, pop(0) к тому же O(n). Глобальная переменная потеряет задачи.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.