Оператор NEWEXECUTOR
Оператор NEWEXECUTOR создаёт действие, позволяющее выполнение других действий в новой службе выполнения — серверном пуле потоков либо клиентском диспетчере.
Синтаксис
NEWEXECUTOR action serviceClause [syncType]
где serviceClause имеет один из следующих вариантов:
THREADS threadExpr
CLIENT connectionExpr
а syncType — один из следующих вариантов:
WAIT [timeoutExpr]
NOWAIT
Описание
Оператор NEWEXECUTOR создает действие, внутри которого все NEWTHREAD диспетчеризуются созданной этим оператором службой выполнения. В режиме THREADS служба представляет собой серверный пул потоков заданного размера: тело каждого вложенного потока разделяет сессию изменений с вызывающим кодом, а NEWTHREAD ... SCHEDULE использует серверный планировщик. В режиме CLIENT служба — это клиентский диспетчер на указанном соединении: действия вложенных потоков доставляются на это соединение и выполняются на сервере приложений в собственной свежей сессии изменений уровня навигатора этого соединения, не привязанной к какой-либо открытой форме; интерактивные операторы внутри потока направляются в UI этого соединения, а NEWTHREAD ... SCHEDULE использует клиентский таймер.
syncType определяет, дожидается ли оператор завершения вложенных потоков. В режиме WAIT оператор не завершается, пока не завершатся все вложенные NEWTHREAD, после чего значения, записанные через NEWTHREAD ... TO p, применяются в текущей сессии. Форма NEWTHREAD ... CLIENT p без TO в ожидание не входит. Если задан тайм-аут ожидания и какие-то потоки в него не уложились, оператор выбрасывает ошибку; значения от потоков, завершившихся ранее, всё равно применяются и видны в окружающем TRY ... CATCH.
Параметры
-
actionКонтекстно-зависимый оператор-действие, описывающий действие, которое будет выполнено.
-
threadExprВыражение, значение которого определяет размер серверного пула потоков. Тип значения —
INTEGER. Если значениеNULLили 0, размер пула устанавливается равным количеству доступных процессоров сервера. -
connectionExprВыражение, значение которого определяет соединение, в интерактивный контекст которого будут диспетчеризованы вложенные
NEWTHREAD. Возвращаемый класс —SystemEvents.Connection. Если значениеNULL(или не разрешается в объектSystemEvents.Connection), оператор завершается без выполнения внутреннего действия и без ошибки. -
syncTypeТип синхронизации. Задается одним из ключевых слов:
WAIT— синхронное выполнение: оператор дожидается завершения всех вложенныхNEWTHREAD(кроме формыNEWTHREAD ... CLIENT pбезTO, которая в ожидание не входит) и применяет ихTO-результаты. Опционально послеWAITуказывается выражение тайм-аута (см.timeoutExpr).NOWAIT— асинхронное выполнение: оператор завершается сразу после диспетча всех вложенныхNEWTHREAD. Несовместимо сNEWTHREAD ... TO, которое требуетWAIT.NEWTHREAD ... SCHEDULE PERIOD ...требует именно этой формы, так как периодический поток не завершается.
По умолчанию (без
syncType) используетсяWAITбез тайм-аута. -
timeoutExprВыражение, значение которого определяет тайм-аут ожидания завершения вложенных потоков в миллисекундах. Тип значения —
INTEGERилиLONG, значение должно быть строго положительным. Тайм-аут применяется к каждому шагу ожидания и не является строгим общим deadline для всех потоков — при множестве одновременно ожидаемых потоков суммарное время ожидания может оказаться больше заданного.
Примеры
testExecutor {
// Серверный пул из 10 потоков, ожидание завершения
NEWEXECUTOR {
FOR id(Sku s) DO {
NEWTHREAD {
NEWSESSION {
name(s) <- STRING[20](id(s));
APPLY;
}
}
}
} THREADS 10 WAIT;
// Запуск действия на стороне клиента без ожидания
NEWEXECUTOR {
NEWTHREAD MESSAGE 'Привет с клиента';
} CLIENT currentConnection() NOWAIT;
// Сбор результатов из потоков с тайм-аутом ожидания
LOCAL a = INTEGER ();
LOCAL b = INTEGER ();
TRY {
NEWEXECUTOR {
NEWTHREAD { RETURN computeFast(); } TO a;
NEWTHREAD { RETURN computeSlow(); } TO b;
} THREADS 2 WAIT 5000;
} CATCH {
// a / b могут быть заполнены частично, если не все потоки уложились в тайм-аут
MESSAGE 'таймаут: ' + messageCaughtException();
}
}