# Блокировки как средство управления параллелизмом Управление блокировками является центральной концепцией в контексте многопользовательских систем при совместном, параллельном использовании ресурсов несколькими пользователями, точнее - параллельными процессами. Для построения правильной архитектуры параллельных процессов очень важно понимать основные принципы работы блокировок, чтобы не допускать распространенных ошибок. Мы не будем приводить подробное описание принципа работы блокировок, тк такие статьи можно с легкостью найти в интернете, но для тех кто в этом совсем новичок, приведем список статей, которые имеет смысл изучить, хотя-бы поверхностно:
[Состояние гонки (Race Condition)](https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%B3%D0%BE%D0%BD%D0%BA%D0%B8) |
[Взаимная блокировка (Deadlock)](https://ru.wikipedia.org/wiki/%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BD%D0%B0%D1%8F_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0) |
[Атомарная операция (Atomic Operation)](https://ru.wikipedia.org/wiki/%D0%90%D1%82%D0%BE%D0%BC%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F) |
[Параллельные вычисления](https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F) |
[Распределённый менеджер блокировок](https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA) |
**ВНИМАНИЕ!!!** Будьте очень аккуратны при использовании функций блокировок, неправильное использование может нарушить работоспособность всей системы! Ваш бот может быть внесен в черный список а все вебхуки и задания бота будут исключаться из очередей!
Подробное описание назначения блокировок с описанием примеров смотрите в статье про блокировки в нашем блоге. **ДОБАВИТЬ ССЫЛКУ!**
### Методы блокировок в Metabot Приложение Metabot предлагает ряд методов, которые помогают управлять блокировками.Все перечисленные ниже методы вам не нужны, если вы используете стандартные функции связанные с контакт-центром: lead.**assignDialogToNextOperator**, lead.**assignDialogToOperator** или lead.**getNextOperators** и т.д., так как данные функции уже включают в себя алгоритмы блокировок.
#### Методы генерации имени блокировок Использование на данный момент смысла не имеет, функции блокировок сами добавляют дополнительные префиксы к именами блокировок указанным в аргументах функций.Метод | Описание |
bot.**getLockNameForBot**(string $lockName, string $lockPrefix = ''): **string** | Генерирует имя блокировки по боту |
bot.**getLockNameForBusiness**(string $lockName, string $lockPrefix = ''): **string** | Генерирует имя блокировки по бизнесу |
Метод | Описание |
bot.**waitForBusinessLock**(string $lockName, string $lockPrefix = '', ?int $ttlSec = null, $maxWaitSec = 300): **bool** | Захватывает блокировку по бизнесу |
bot.**waitForBotLock**(string $lockName, string $lockPrefix = '', ?int $ttlSec = null, $maxWaitSec = 300): **bool** | Захватывает блокировку по боту |
Если нет понимания что указать в параметре ttlSec, укажите значение равное 30 (это значит что блокировка будет автоматически удалена спустя 30 секунд, если вы забыли это сделать в коде), это необходимо, чтобы не возникло взаимной блокировки, если же вы указываете время жизни равное 0, то блокировка не ограничена по времени, но в таком случае нужно подходить к алгоритмам еще тщательнее, чтобы не забывать освобождать блокировку.
#### Методы удаления блокировок Данные методы позволяют освобождать различные виды блокировок. Какие именно из этих методов использовать зависит от того, была ли блокировка создана в текущем скрипте или нет, и нужно ли вам принудительно освободить блокировку.Метод | Описание |
bot.**releaseAllCurrentLocks**(): **bool** | Освобождает все блокировки захваченные в текущем скрипте |
bot.**releaseCurrentLockForBusiness**(string $lockName, string $lockPrefix = ''): **bool** | Освобождает блокировку захваченную текущем скрипте по бизнесу |
bot.**releaseCurrentLockForBot**(string $lockName, string $lockPrefix = ''): **bool** | Освобождает блокировку захваченную в текущем скрипте по боту |
bot.**releaseLockForBusiness**(string $lockName, string $lockPrefix = ''): **bool** | Освобождает блокировку по бизнесу |
bot.**releaseLockForBot**(string $lockName, string $lockPrefix = ''): **bool** | Освобождает блокировку по боту |
Метод | Описание |
bot.**hasLockForBusiness**(string $lockName, string $lockPrefix = '', $checkValue = null): **bool** | Проверяет существование блокировки по бизнесу |
bot.**hasLockForBot**(string $lockName, string $lockPrefix = '', $checkValue = null): **bool** | Проверяет существование блокировки по боту |
Подробнее методы перечисленные выше и примеры к ним вы можете изучить в [**Справочнике по функциям JS**](https://docs.metabot24.ru/books/7-spravocnik-po-funkciyam-js/page/spravocnik-vsex-funkcii-Cgt "Справочник всех функций")
**ВНИМАНИЕ!!!** Если у вас нет понимания как пользоваться функциями блокировок, то лучше не экспериментировать и обратиться к нашим специалистам!