Библиотека для организации "семафора" - инструмента ограничения одновременного выполнения участков кода.

semaphore

Библиотека для организации "семафора" - инструмента ограничения одновременного выполнения участков кода в многопоточной среде.

Классическое использование семафора

// Однопоточный код, стартующий несколько потоков обработки чего-либо
КоличествоПотоков = 3;

Семафор = Новый Семафор(КоличествоПотоков);

// Запуск многопоточного кода
Для сч = 1 По 10 Цикл
    ЗапускОтдельногоПотока(Семафор);
КонецЦикла;

// Процедура, выполняющаяся в отдельных потоках
//
Процедура ЗапускОтдельногоПотока(Семафор)
    ТаймаутОжиданияВМиллисекундах = 1000;
    // Если одновременно выполняющихся потоков больше, чем 3
    // (переменная КоличествоПотоков, с которой создавался семафор),
    // то захват семафора будет ждать освобождения свободного потока.
    // По истечению таймаута вызовется исключение.
    Семафор.Захватить(ТаймаутОжиданияВМиллисекундах);

    // полезная нагрузка...

    Семафор.Освободить();
КонецПроцедуры

Использование пула семафоров

// Процедура, выполняющаяся в отдельных потоках
//
Процедура ЗапускОтдельногоПотока()
    КлючОперации = "Очень важный участок кода, который надо выполнять синхронно";
    КоличествоПотоков = 1;
    // Все потоки, получающие семафоры по ключу операции, получат один и тот же семафор с общим счетчиком.
    Семафор = Семафоры.Получить(КлючОперации, КоличествоПотоков);

    ТаймаутОжиданияВМиллисекундах = 1000;
    Семафор.Захватить(ТаймаутОжиданияВМиллисекундах);

    // полезная нагрузка...

    Семафор.Освободить();
КонецПроцедуры

Доступные версии пакета

1.0.2
Изменен: 03.06.2019 7:35:36
1.0.1
Изменен: 02.01.2019 19:48:29
1.0.0
Изменен: 02.01.2019 19:48:29
В разработке

Репозиторий

https://github.com/oscript-library/semaphore

Актуальная версия

semaphore-1.0.2