«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как реализовать блокировку с крайним сроком в Golang?

Как реализовать блокировку с крайним сроком в Golang?

Опубликовано 9 ноября 2024 г.
Просматривать:327

How to Implement a Lock with a Deadline in Golang?

Получение блокировок с ограничениями по времени в Golang

При работе с блокировками в Golang бывают ситуации, когда вам может потребоваться либо получить блокировку немедленно или соблюсти тот или иной срок. Хотя стандартная библиотека sync.Mutex предоставляет только функции Lock() и Unlock(), существует метод, позволяющий эмулировать блокировку с крайним сроком.

Реализация блокировки с крайним сроком

Чтобы создать блокировку с крайним сроком, вы можете использовать канал с размером буфера, равным единице:

l := make(chan struct{}, 1)

Чтобы заблокировать, отправьте в канал значение структуры:

l 

Чтобы разблокировать, получите от канала:

Выполнение попытки блокировки

Чтобы попытаться выполнить попытку блокировки, используйте оператор select:

select {
case l 

Этот код немедленно получит блокировку, если она доступна. Если блокировка уже удержана, оператор select будет блокироваться до тех пор, пока блокировка не будет снята.

Попробовать блокировку с таймаутом

Чтобы указать тайм-аут для блокировки попытки, добавьте канал time.After() для оператора выбора:

select {
case l 

Этот код будет пытаться получить блокировку в течение одной минуты. Если тайм-аут истечет, оператор select завершится, и блокировка не будет получена.

Заключение

Использование канала с размером буфера, равным единице, в качестве мьютекса позволяет реализовать блокировку попытки с указанием крайнего срока. Этот метод может быть полезен в сценариях, когда вам необходимо получить блокировку быстро или в течение определенного периода времени.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3