semaphore

22 ноября 2018 10:56

Скрипты OneScript


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

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

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

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

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

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

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

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

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

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

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

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

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

Комментарии

Модератору