xozzslip
@xozzslip
Чекни мой канал о кодинге https://bit.ly/2LNBAL8

Как реализовать блокировку ресурса для всех потоков, кроме одного (еще раз)?

Уже задавал подобный вопрос, но в этот раз проблема чуть сложнее.

Есть таблица в которой хранятся токены для выполнения запросов к vk api. Нужно сделать так, чтобы один и тот же токен не мог использоваться одновременно двумя разными потоками. Если потоку понадобился токен, он выбирал из некоторого списка имеющихся или ждал, если свободных токенов нет.
  • Вопрос задан
  • 183 просмотра
Решения вопроса 1
@nirvimel
Для этого удобно использовать очередь queue (howto).
  1. Изначально в очередь загоняются (put) все доступные токены.
  2. Каждый поток получает (get) один свободный токен из очереди (предварительно ожидает пока он там появятся).
  3. Как только токен освобождается, он кладется (put) обратно в очередь и его моментально подхватывает один из ожидающих потоков.

Схема будет отлично работать и не вызывать коллизий при количестве потоков многократно превосходящем количество токенов, но только если токены захватываются на непродолжительное время и быстро освобождаются, иначе большая часть потоков будут вечно висеть в ожидании свободных токенов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы