zone
create(id: string, settings: ZoneSettings = DEFAULT_SETTINGS): Zone
get(id: string): Zone
current: Zone
node: Zone
ZoneSettings
DEFAULT_SETTINGS: ZoneSettings
Zone
zone.id: string
zone.broadcast(code: string): Promise<void>
zone.broadcast(function: (...args: any[]) => void, args?: any[]): Promise<void>
zone.execute(moduleName: string, functionName: string, args?: any[], options?: CallOptions): Promise<Result>
zone.execute(function: (...args[]) => any, args?: any[], options?: CallOptions): Promise<Result>
CallOptions
Result
Zone — это ключевая концепция napajs, которая предоставляет возможности многопоточности в мире JavaScript и представляет собой логическую группу симметричных рабочих процессов для выполнения определённых задач.
Обратите внимание, что это не то же самое понятие зоны, как контекстный объект для асинхронных вызовов в Dart, Angular или предложение в TC39.
Зона состоит из одного или нескольких потоков JavaScript, каждый поток мы называем worker. Рабочие внутри зоны симметричны, это означает, что код, выполняемый на любом рабочем из зоны, должен возвращать один и тот же результат, а внутреннее состояние каждого рабочего должно быть одинаковым с точки зрения долгосрочного использования.
В одном процессе могут сосуществовать несколько зон, каждая из которых загружает разный код, имеет разное состояние или применяет разные политики, такие как размер кучи и т. д. Цель наличия нескольких зон — позволить выполнять различные роли для сложных задач, при этом каждая роль загружает минимум ресурсов для своего использования.
Существует два типа зон:
Существуют две операции, предназначенные для усиления симметрии рабочих внутри зоны:
Операции с зоной выполняются по принципу «первым пришёл — первым обслужен», при этом broadcast имеет более высокий приоритет над execute. Создание зоны с использованием библиотеки napajs
var napa = require('napajs');
var zone1 = napa.zone.create('zone1');
Пример 2: Создание зоны с идентификатором 'zone2', с 1 рабочим.
var zone2 = napa.zone.create('zone2', {
workers: 1
});
Получает ссылку на зону по идентификатору. Если зона не существует, будет выброшено исключение.
Пример:
var zone = napa.zone.get('zone1');
Возвращает ссылку на зону текущего запущенного изолятора. Если это в среде node, то возвращает зону узла.
Пример: Получить текущую зону.
var zone = napa.zone.current;
Возвращает ссылку на зону узла. Это эквивалентно napa.zone.get('node')
.
Пример:
var zone = napa.zone.node;
Настройки для зон, которые будут указаны при создании зон. Если не указано, будут использоваться DEFAULT_SETTINGS.
Количество рабочих в зоне.
Значения по умолчанию для создания зон.
{
workers: 2
}
Зона — это базовая концепция для выполнения JavaScript и применения политик в Napa. Вы можете найти его определение в Введение. Через API зоны разработчики могут транслировать код JavaScript на всех рабочих или выполнять функцию на одном из них. При программировании против зоны лучше всего обеспечить, чтобы все рабочие в зоне были симметричны друг другу, то есть вы не должны предполагать, что рабочий может поддерживать свои собственные состояния.
Два основных набора API — broadcast
и execute
, которые являются асинхронными операциями с несколькими вариантами ввода.
Получение идентификатора зоны.
Асинхронная трансляция фрагмента кода JavaScript в виде строки всем рабочим, которая возвращает Promise типа void. Если какой-либо из рабочих не смог выполнить код, обещание будет отклонено с сообщением об ошибке.
Пример:
var napa = require('napajs');
var zone = napa.zone.get('zone1');
zone.broadcast('var state = 0;')
.then(() => {
console.log('трансляция прошла успешно.');
})
.catch((error) => {
console.log('трансляция не удалась.')
});
Синхронная трансляция фрагмента кода JavaScript в виде строки всем рабочим. Если какой-либо из рабочих не сможет выполнить код, будет выдано исключение с сообщением об ошибке.
Примечания:
broadcastSync
в текущей зоне. Это вызовет тупик.Пример:
var napa = require('napajs');
var zone = napa.zone.get('zone1');
try {
zone.broadcastSync('var state = 0;');
console.log('трансляция прошла успешно.');
} catch (error) {
console.log('трансляция не удалась.')
}
Асинхронная трансляция анонимной функции с аргументами всем рабочим, которая возвращает Promise типа void. Если какой-либо из рабочих не сможет выполнить код, обещание будет отклонено с сообщением об ошибке.
Примечания:
broadcast
.origin
, он будет использовать текущий файл как origin
, который будет использоваться для установки __filename
и __dirname
. (См. транспорт функций)TransportError
), будут преобразованы в обычные ошибки JavaScript. zone.broadcast((state) => {
require('some-module').setModuleState(state)
}, [{field1: 1}])
.then(() => {
console.log('broadcast succeeded.');
})
.catch((error) => {
console.log('broadcast failed:', error)
});
zone.broadcastSync(function: (...args: any[]) => void | Promise<void>, args?: any[]): void
Синхронно транслирует анонимную функцию с аргументами всем воркерам. Если какой-либо из воркеров не смог выполнить код, будет выброшено исключение с сообщением об ошибке.
Примечания:
Пример:
try {
zone.broadcastSync((state) => {
require('some-module').setModuleState(state)
}, [{field1: 1}]);
console.log('broadcast succeeded.');
} catch (error) {
console.log('broadcast failed:', error)
}
zone.execute(moduleName: string, functionName: string, args?: any[], options?: CallOptions): Promise<any>
Выполняет функцию асинхронно на произвольном воркере через имя модуля и имя функции. Аргументы могут быть любого типа JavaScript, который можно транспортировать. Возвращает Promise объекта Result. Если произойдёт ошибка, либо плохой код, пользовательское исключение или достигнут тайм-аут, обещание будет отклонено.
Пример: Выполнить функцию bar в модуле foo с аргументами [1, «hello», { field1: 1 }]. Применяется тайм-аут 300 мс.
zone.execute(
'foo',
'bar',
[1, "hello", {field1: 1}],
{ timeout: 300 })
.then((result) => {
console.log('execute succeeded:', result.value);
})
.catch((error) => {
console.log('execute failed:', error);
});
zone.execute(function: (...args: any[]) => any, args?: any[], options?: CallOptions): Promise<any>
Выполнить объект функции асинхронно на произвольном работнике. Аргументы могут быть любого типа JavaScript, который можно транспортировать. Возвращается Promise объекта Result. Если произойдёт ошибка, либо плохой код, пользовательское исключение или тайм-аут достигнут, обещание будет отклонено.
Примечания:
Пример:
zone.execute((a: number, b: string, c: object) => {
return a + b + JSON.stringify(c);
}, [1, "hello", {field1: 1}])
.then((result) => {
console.log('execute succeeded:', result.value);
})
.catch((error) => {
console.log('execute failed:', error);
});
Вывод:
execute succeeded: 1hello{"field1":1}
``` ## Выполнение zone.execute(() => { console.log(__filename);});
Вывод:
/usr/file1.js
##
Интерфейс `CallOptions`
Интерфейс для опций вызова функций в `zone.execute`.
### options.timeout: number
Время ожидания в миллисекундах. Значение по умолчанию 0 указывает на отсутствие времени ожидания.
## Результат
Интерфейс `Result`
Интерфейс доступа к возвращаемому значению из [`execute`](#execute-by-name).
### result.value: any
Значение JavaScript, возвращённое функцией, которая вызывается из zone.execute/executeSync. Napa выполняет маршаллинг/унмаршаллинг [переносимых значений](transport.md#transportable-types) между разными воркерами (V8 isolates). Унмаршаллинг происходит при первом запросе `result.value`.
Пример:
```js
var value = result.value;
Маршалированная полезная нагрузка (в формате JSON) из возвращённого значения. Это поле предназначено для пользователей, которые хотят передать результаты своему вызывающему объекту, где не требуется размаршалированное значение.
Пример:
var payload = result.payload;
TransportContext, который необходим для унмаршаллинга result.payload
в result.value
.
Пример:
var napa = require('napajs');
var zone = napa.zone.create('zone1');
zone.execute(() => { return 0; }, [])
.then((result) => {
// Ручной маршаллинг.
var transportContext = result.transportContext;
var value = napa.transport.unmarshall(result.payload, result.transportContext);
// result.value и ручной размаршаллинг из полезной нагрузки совпадают.
assert.equal(value, result.value);
});
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )