Spec-Zone.ru › Deno 2

worker_threads

Модуль node:worker_threads позволяет использовать потоки, выполняющие JavaScript параллельно. Для доступа к нему:

import worker from 'node:worker_threads';

Рабочие потоки полезны для выполнения ресурсоёмких операций JavaScript, требующих интенсивного использования процессора. Для задач с интенсивным вводом-выводом они не так полезны. Встроенные асинхронные операции ввода-вывода Node.js эффективнее рабочих потоков.

В отличие от child_process или cluster, worker_threads могут совместно использовать память. Это достигается передачей экземпляров ArrayBuffer или совместным использованием экземпляров SharedArrayBuffer.

import {
  Worker, isMainThread, parentPort, workerData,
} from 'node:worker_threads';
import { parse } from 'some-js-parsing-library';

if (isMainThread) {
  module.exports = function parseJSAsync(script) {
    return new Promise((resolve, reject) => {
      const worker = new Worker(__filename, {
        workerData: script,
      });
      worker.on('message', resolve);
      worker.on('error', reject);
      worker.on('exit', (code) => {
        if (code !== 0)
          reject(new Error(`Worker stopped with exit code ${code}`));
      });
    });
  };
} else {
  const script = workerData;
  parentPort.postMessage(parse(script));
}

Приведённый выше пример создаёт поток Worker для каждого вызова parseJSAsync(). На практике для таких задач следует использовать пул рабочих потоков. В противном случае накладные расходы на создание рабочих потоков, скорее всего, превысят их пользу.

При реализации пула рабочих потоков используйте API AsyncResource, чтобы сообщить диагностическим инструментам (например, для формирования асинхронных трассировок стека) о связи между задачами и их результатами. Пример реализации см. в "Using AsyncResource for a Worker thread pool" документации async_hooks.

По умолчанию рабочие потоки наследуют параметры, не относящиеся к конкретному процессу. Информацию о настройке параметров рабочих потоков, в частности параметров argv и execArgv, см. в Worker constructor options.

Использование в Deno

import * as mod from "node:worker_threads";

класс MessageChannel

Использование в Deno

import { MessageChannel } from "node:worker_threads";

Экземпляры класса worker.MessageChannel представляют собой асинхронный двусторонний канал связи. У MessageChannel нет собственных методов. new MessageChannel() возвращает объект со свойствами port1 и port2, которые ссылаются на связанные экземпляры MessagePort.

import { MessageChannel } from 'node:worker_threads';

const { port1, port2 } = new MessageChannel();
port1.on('message', (message) => console.log('received', message));
port2.postMessage({ foo: 'bar' });
// Prints: received { foo: 'bar' } from the `port1.on('message')` listener

Свойства

port1: MessagePort
только для чтения
port2: MessagePort
только для чтения

переменная MessageChannel

Класс MessageChannel является глобальной ссылкой на import { MessageChannel } from 'worker_threads' https://nodejs.org/api/globals.html#messagechannel

Тип

globalThis extends { onmessage: any; MessageChannel: infer T; } ? T : _MessageChannel

класс MessagePort

наследует EventEmitter

Использование в Deno

import { MessagePort } from "node:worker_threads";

Экземпляры класса worker.MessagePort представляют один конец асинхронного двустороннего канала связи. С их помощью можно передавать структурированные данные, области памяти и другие объекты MessagePort между разными Worker.

Эта реализация соответствует браузерным MessagePort.

Свойства

addEventListener: EventTarget["addEventListener"]
dispatchEvent: EventTarget["dispatchEvent"]
removeEventListener: EventTarget["removeEventListener"]

Методы

addListener(
event: "close",
listener: () => void,
): this
addListener(
event: "message",
listener: (value: any) => void,
): this
addListener(
event: "messageerror",
listener: (error: Error) => void,
): this
addListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
close(): void

Запрещает дальнейшую отправку сообщений в обоих направлениях соединения. Этот метод можно вызвать, если через этот MessagePort больше не будет передаваться информация.

Событие 'close' event возникает у обоих экземпляров MessagePort, участвующих в канале.

emit(event: "close"): boolean
emit(
event: "message",
value: any,
): boolean
emit(
event: "messageerror",
error: Error,
): boolean
emit(
event: string | symbol,
...args: any[],
): boolean
off(
event: "close",
listener: () => void,
): this
off(
event: "message",
listener: (value: any) => void,
): this
off(
event: "messageerror",
listener: (error: Error) => void,
): this
off(
event: string | symbol,
listener: (...args: any[]) => void,
): this
on(
event: "close",
listener: () => void,
): this
on(
event: "message",
listener: (value: any) => void,
): this
on(
event: "messageerror",
listener: (error: Error) => void,
): this
on(
event: string | symbol,
listener: (...args: any[]) => void,
): this
once(
event: "close",
listener: () => void,
): this
once(
event: "message",
listener: (value: any) => void,
): this
once(
event: "messageerror",
listener: (error: Error) => void,
): this
once(
event: string | symbol,
listener: (...args: any[]) => void,
): this
postMessage(
value: any,
transferList?: readonly TransferListItem[],
): void

Отправляет значение JavaScript принимающей стороне этого канала. value передаётся способом, совместимым с алгоритмом структурированного клонирования HTML.

В частности, основные отличия от JSON таковы:

  • value может содержать циклические ссылки.
  • value может содержать экземпляры встроенных типов JavaScript, таких как RegExp, BigInt, Map, Set и т. д.
  • value может содержать типизированные массивы, использующие как ArrayBuffer, так и SharedArrayBuffer.
  • value может содержать экземпляры WebAssembly.Module.
  • value не может содержать нативные объекты (на основе C++), кроме:
import { MessageChannel } from 'node:worker_threads';
const { port1, port2 } = new MessageChannel();

port1.on('message', (message) => console.log(message));

const circularData = {};
circularData.foo = circularData;
// Prints: { foo: [Circular] }
port2.postMessage(circularData);

transferList может быть списком объектов ArrayBuffer, MessagePort и FileHandle. После передачи они становятся недоступны на отправляющей стороне канала (даже если не входят в value). В отличие от child processes, передача дескрипторов, например сетевых сокетов, в настоящее время не поддерживается.

Если value содержит экземпляры SharedArrayBuffer, они доступны из обоих потоков. Их нельзя указывать в transferList.

value всё ещё может содержать экземпляры ArrayBuffer, не включённые в transferList; в этом случае базовая память копируется, а не перемещается.

import { MessageChannel } from 'node:worker_threads';
const { port1, port2 } = new MessageChannel();

port1.on('message', (message) => console.log(message));

const uint8Array = new Uint8Array([ 1, 2, 3, 4 ]);
// This posts a copy of `uint8Array`:
port2.postMessage(uint8Array);
// This does not copy data, but renders `uint8Array` unusable:
port2.postMessage(uint8Array, [ uint8Array.buffer ]);

// The memory for the `sharedUint8Array` is accessible from both the
// original and the copy received by `.on('message')`:
const sharedUint8Array = new Uint8Array(new SharedArrayBuffer(4));
port2.postMessage(sharedUint8Array);

// This transfers a freshly created message port to the receiver.
// This can be used, for example, to create communication channels between
// multiple `Worker` threads that are children of the same parent thread.
const otherChannel = new MessageChannel();
port2.postMessage({ port: otherChannel.port1 }, [ otherChannel.port1 ]);

Объект сообщения клонируется сразу, поэтому после отправки его можно изменить без каких-либо побочных эффектов.

Дополнительные сведения о механизмах сериализации и десериализации, лежащих в основе этого API, см. в serialization API of the node:v8 module.

prependListener(
event: "close",
listener: () => void,
): this
prependListener(
event: "message",
listener: (value: any) => void,
): this
prependListener(
event: "messageerror",
listener: (error: Error) => void,
): this
prependListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
prependOnceListener(
event: "close",
listener: () => void,
): this
prependOnceListener(
event: "message",
listener: (value: any) => void,
): this
prependOnceListener(
event: "messageerror",
listener: (error: Error) => void,
): this
prependOnceListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
ref(): void

Противоположность unref(). Вызов ref() для порта, ранее подвергнутого unref(), не позволяет программе завершиться, если это единственный оставшийся активный дескриптор (поведение по умолчанию). Если порт подвергнут ref(), повторный вызов ref() ничего не меняет.

Если слушатели добавляются или удаляются с помощью .on('message'), порт автоматически подвергается ref() или unref() в зависимости от наличия слушателей события.

removeListener(
event: "close",
listener: () => void,
): this
removeListener(
event: "message",
listener: (value: any) => void,
): this
removeListener(
event: "messageerror",
listener: (error: Error) => void,
): this
removeListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
start(): void

Запускает получение сообщений через этот MessagePort. При использовании этого порта в качестве эмиттера событий метод вызывается автоматически после добавления слушателей 'message'.

Этот метод существует для совместимости с API Web MessagePort. В Node.js он полезен только для игнорирования сообщений, когда слушатель событий отсутствует. Обработка .onmessage в Node.js также отличается. Установка этого параметра автоматически вызывает .start(), а его сброс позволяет сообщениям накапливаться в очереди, пока не будет задан новый обработчик или порт не будет удалён.

unref(): void

Вызов unref() для порта позволяет потоку завершиться, если этот порт является единственным активным дескриптором в системе событий. Если порт уже подвергнут unref(), повторный вызов unref() ничего не меняет.

Если слушатели добавляются или удаляются с помощью .on('message'), порт автоматически подвергается ref() или unref() в зависимости от наличия слушателей события.

переменная MessagePort

Класс MessagePort является глобальной ссылкой на import { MessagePort } from 'worker_threads' https://nodejs.org/api/globals.html#messageport

Тип

globalThis extends { onmessage: any; MessagePort: infer T; } ? T : _MessagePort

класс Worker

наследует EventEmitter

Использование в Deno

import { Worker } from "node:worker_threads";
Совместимость с Deno

Метод getHeapSnapshot не поддерживается.

Класс Worker представляет собой независимый поток выполнения JavaScript. В нём доступны большинство API Node.js.

Примечательные отличия среды Worker:

  • Потоки process.stdin, process.stdout и process.stderr могут перенаправляться родительским потоком.
  • Переменной import { isMainThread } from 'node:worker_threads' присваивается значение false.
  • Доступен порт сообщений import { parentPort } from 'node:worker_threads'.
  • process.exit() останавливает не всю программу, а только отдельный поток, а process.abort() недоступен.
  • Методы process.chdir() и process, задающие идентификаторы групп или пользователей, недоступны.
  • process.env — это копия переменных окружения родительского потока, если не указано иное. Изменения в одной копии не видны в других потоках и не видны нативным дополнениям (если только worker.SHARE_ENV не передан как параметр env конструктору Worker). В Windows, в отличие от основного потока, копия переменных окружения работает с учётом регистра.
  • process.title нельзя изменить.
  • Сигналы не передаются через process.on('...').
  • Выполнение может быть остановлено в любой момент в результате вызова worker.terminate().
  • Каналы IPC родительских процессов недоступны.
  • Модуль trace_events не поддерживается.
  • Нативные дополнения можно загружать из нескольких потоков, только если они соответствуют требованиям certain conditions.

Можно создавать экземпляры Worker внутри других экземпляров Worker.

Как и в веб-воркерах и node:cluster module, двустороннюю связь можно обеспечить обменом сообщениями между потоками. Внутри Worker имеется встроенная пара MessagePort, которые уже связаны друг с другом при создании Worker. Хотя объект MessagePort на стороне родительского потока напрямую не доступен, его функциональность предоставляется через worker.postMessage() и событие worker.on('message') объекта Worker родительского потока.

Чтобы создавать пользовательские каналы обмена сообщениями (это предпочтительнее использования глобального канала по умолчанию, поскольку способствует разделению обязанностей), можно создать объект MessageChannel в любом потоке и передать один из MessagePort этого MessageChannel в другой поток через уже существующий канал, например глобальный.

Дополнительные сведения о передаче сообщений и о том, какие значения JavaScript можно успешно передать через границу потоков, см. в port.postMessage().

import assert from 'node:assert';
import {
  Worker, MessageChannel, MessagePort, isMainThread, parentPort,
} from 'node:worker_threads';
if (isMainThread) {
  const worker = new Worker(__filename);
  const subChannel = new MessageChannel();
  worker.postMessage({ hereIsYourPort: subChannel.port1 }, [subChannel.port1]);
  subChannel.port2.on('message', (value) => {
    console.log('received:', value);
  });
} else {
  parentPort.once('message', (value) => {
    assert(value.hereIsYourPort instanceof MessagePort);
    value.hereIsYourPort.postMessage('the worker is sending this');
    value.hereIsYourPort.close();
  });
}

Конструкторы

Worker(
filename: string | URL,
options?: WorkerOptions,
)
новый

Свойства

performance: WorkerPerformance
только для чтения

Объект для получения сведений о производительности экземпляра Worker. Аналог perf_hooks.performance.

resourceLimits: ResourceLimits | undefined
только для чтения
необязательный

Предоставляет набор ограничений ресурсов движка JS для этого потока Worker. Если конструктору Worker передан параметр resourceLimits, здесь будут указаны соответствующие значения.

Если работа Worker остановлена, возвращается пустой объект.

stderr: Readable
только для чтения

Это поток для чтения, содержащий данные, записанные в process.stderr внутри потока Worker. Если конструктору Worker не передан параметр stderr: true, данные направляются в поток process.stderr родительского потока.

stdin: Writable | null
только для чтения

Если конструктору Worker передан параметр stdin: true, это поток для записи. Данные, записанные в этот поток, будут доступны в потоке Worker как process.stdin.

stdout: Readable
только для чтения

Это поток для чтения, содержащий данные, записанные в process.stdout внутри потока Worker. Если конструктору Worker не передан параметр stdout: true, данные направляются в поток process.stdout родительского потока.

threadId: number
только для чтения

Целочисленный идентификатор указанного потока. Внутри потока Worker он доступен как import { threadId } from 'node:worker_threads'. Это значение уникально для каждого экземпляра Worker в пределах одного процесса.

Методы

addListener(
event: "error",
listener: (err: Error) => void,
): this
addListener(
event: "exit",
listener: (exitCode: number) => void,
): this
addListener(
event: "message",
listener: (value: any) => void,
): this
addListener(
event: "messageerror",
listener: (error: Error) => void,
): this
addListener(
event: "online",
listener: () => void,
): this
addListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
emit(
event: "error",
err: Error,
): boolean
emit(
event: "exit",
exitCode: number,
): boolean
emit(
event: "message",
value: any,
): boolean
emit(
event: "messageerror",
error: Error,
): boolean
emit(event: "online"): boolean
emit(
event: string | symbol,
...args: any[],
): boolean
getHeapSnapshot(): Promise<Readable>

Возвращает поток для чтения снимка V8 текущего состояния Worker. Подробности см. в v8.getHeapSnapshot().

Если поток Worker больше не работает (это может произойти до создания события 'exit' event), возвращённый Promise немедленно отклоняется с ошибкой ERR_WORKER_NOT_RUNNING.

off(
event: "error",
listener: (err: Error) => void,
): this
off(
event: "exit",
listener: (exitCode: number) => void,
): this
off(
event: "message",
listener: (value: any) => void,
): this
off(
event: "messageerror",
listener: (error: Error) => void,
): this
off(
event: "online",
listener: () => void,
): this
off(
event: string | symbol,
listener: (...args: any[]) => void,
): this
on(
event: "error",
listener: (err: Error) => void,
): this
on(
event: "exit",
listener: (exitCode: number) => void,
): this
on(
event: "message",
listener: (value: any) => void,
): this
on(
event: "messageerror",
listener: (error: Error) => void,
): this
on(
event: "online",
listener: () => void,
): this
on(
event: string | symbol,
listener: (...args: any[]) => void,
): this
once(
event: "error",
listener: (err: Error) => void,
): this
once(
event: "exit",
listener: (exitCode: number) => void,
): this
once(
event: "message",
listener: (value: any) => void,
): this
once(
event: "messageerror",
listener: (error: Error) => void,
): this
once(
event: "online",
listener: () => void,
): this
once(
event: string | symbol,
listener: (...args: any[]) => void,
): this
postMessage(
value: any,
transferList?: readonly TransferListItem[],
): void

Отправляет сообщение Worker, которое принимается через require('node:worker_threads').parentPort.on('message'). Подробности см. в port.postMessage().

postMessageToThread(
threadId: number,
value: any,
timeout?: number,
): Promise<void>

Отправляет значение другому Worker, указанному по идентификатору потока.

postMessageToThread(
threadId: number,
value: any,
transferList: readonly TransferListItem[],
timeout?: number,
): Promise<void>
prependListener(
event: "error",
listener: (err: Error) => void,
): this
prependListener(
event: "exit",
listener: (exitCode: number) => void,
): this
prependListener(
event: "message",
listener: (value: any) => void,
): this
prependListener(
event: "messageerror",
listener: (error: Error) => void,
): this
prependListener(
event: "online",
listener: () => void,
): this
prependListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
prependOnceListener(
event: "error",
listener: (err: Error) => void,
): this
prependOnceListener(
event: "exit",
listener: (exitCode: number) => void,
): this
prependOnceListener(
event: "message",
listener: (value: any) => void,
): this
prependOnceListener(
event: "messageerror",
listener: (error: Error) => void,
): this
prependOnceListener(
event: "online",
listener: () => void,
): this
prependOnceListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
ref(): void

Противоположность unref(): вызов ref() для ранее unref()ed Worker не позволяет программе завершиться, если он является единственным оставшимся активным дескриптором (поведение по умолчанию). Если Worker уже ref()ed, повторный вызов ref() ничего не меняет.

removeListener(
event: "error",
listener: (err: Error) => void,
): this
removeListener(
event: "exit",
listener: (exitCode: number) => void,
): this
removeListener(
event: "message",
listener: (value: any) => void,
): this
removeListener(
event: "messageerror",
listener: (error: Error) => void,
): this
removeListener(
event: "online",
listener: () => void,
): this
removeListener(
event: string | symbol,
listener: (...args: any[]) => void,
): this
terminate(): Promise<number>

Как можно скорее останавливает выполнение всего JavaScript в потоке Worker. Возвращает Promise с кодом завершения, который выполняется при создании события 'exit' event.

unref(): void

Вызов unref() для Worker позволяет потоку завершиться, если он является единственным активным дескриптором в системе событий. Если Worker уже unref()ed, повторный вызов unref() ничего не меняет.


функция getEnvironmentData

Использование в Deno

import { getEnvironmentData } from "node:worker_threads";
getEnvironmentData(key: Serializable): Serializable

В потоке Worker функция worker.getEnvironmentData() возвращает копию данных, переданных в worker.setEnvironmentData() потока, создавшего Worker. Каждый новый Worker автоматически получает собственную копию данных окружения.

import {
  Worker,
  isMainThread,
  setEnvironmentData,
  getEnvironmentData,
} from 'node:worker_threads';

if (isMainThread) {
  setEnvironmentData('Hello', 'World!');
  const worker = new Worker(__filename);
} else {
  console.log(getEnvironmentData('Hello'));  // Prints 'World!'.
}

Параметры

key: Serializable

Любое произвольное клонируемое значение JavaScript, которое можно использовать в качестве ключа {Map}.

Тип возвращаемого значения

Serializable

функция isMarkedAsUntransferable

Использование в Deno

import { isMarkedAsUntransferable } from "node:worker_threads";
isMarkedAsUntransferable(object: object): boolean

Проверяет, помечен ли объект как непередаваемый с помощью markAsUntransferable.

Параметры

object: object

Тип возвращаемого значения

boolean

функция markAsUncloneable

Использование в Deno

import { markAsUncloneable } from "node:worker_threads";
markAsUncloneable(object: object): void

Помечает объект как неклонируемый. Если object используется в качестве message при вызове port.postMessage(), возникает ошибка. Ничего не происходит, если object — примитивное значение.

Это не влияет на ArrayBuffer и объекты, подобные Buffer.

Эту операцию нельзя отменить.

const { markAsUncloneable } = require('node:worker_threads');

const anyObject = { foo: 'bar' };
markAsUncloneable(anyObject);
const { port1 } = new MessageChannel();
try {
  // This will throw an error, because anyObject is not cloneable.
  port1.postMessage(anyObject)
} catch (error) {
  // error.name === 'DataCloneError'
}

В браузерах нет аналога этого API.

Параметры

object: object

Тип возвращаемого значения

void

функция markAsUntransferable

Использование в Deno

import { markAsUntransferable } from "node:worker_threads";
markAsUntransferable(object: object): void
Совместимость с Deno

Этот символ не поддерживается.

Помечает объект как непередаваемый. Если object присутствует в списке передачи вызова port.postMessage(), он игнорируется.

Это особенно полезно для объектов, которые можно клонировать, а не передавать, и которые используются другими объектами на стороне отправителя. Например, Node.js помечает таким образом ArrayBuffer, используемые для Buffer pool.

Эту операцию нельзя отменить.

import { MessageChannel, markAsUntransferable } from 'node:worker_threads';

const pooledBuffer = new ArrayBuffer(8);
const typedArray1 = new Uint8Array(pooledBuffer);
const typedArray2 = new Float64Array(pooledBuffer);

markAsUntransferable(pooledBuffer);

const { port1 } = new MessageChannel();
port1.postMessage(typedArray1, [ typedArray1.buffer ]);

// The following line prints the contents of typedArray1 -- it still owns
// its memory and has been cloned, not transferred. Without
// `markAsUntransferable()`, this would print an empty Uint8Array.
// typedArray2 is intact as well.
console.log(typedArray1);
console.log(typedArray2);

В браузерах нет аналога этого API.

Параметры

object: object

Тип возвращаемого значения

void

функция moveMessagePortToContext

Использование в Deno

import { moveMessagePortToContext } from "node:worker_threads";
moveMessagePortToContext(
port: MessagePort,
contextifiedSandbox: Context,
): MessagePort
Совместимость с Deno

Этот символ не поддерживается.

Передаёт MessagePort в другой контекст vm. Исходный объект port становится непригодным для использования, а его место занимает возвращённый экземпляр MessagePort.

Возвращённый MessagePort — это объект в целевом контексте, наследующий от глобального класса Object. Объекты, переданные обработчику port.onmessage(), также создаются в целевом контексте и наследуют от его глобального класса Object.

Однако созданный MessagePort больше не наследует от EventTarget, и для получения событий через него можно использовать только port.onmessage().

Параметры

port: MessagePort

Порт сообщений для передачи.

contextifiedSandbox: Context

Объект contextified, возвращаемый методом vm.createContext().

Тип возвращаемого значения

MessagePort

функция receiveMessageOnPort

Использование в Deno

import { receiveMessageOnPort } from "node:worker_threads";
receiveMessageOnPort(port: MessagePort): { message: any; } | undefined
Совместимость с Deno

Этот символ не поддерживается.

Получает одно сообщение из указанного MessagePort. Если сообщений нет, возвращается undefined, в противном случае возвращается объект с единственным свойством message, содержащим полезную нагрузку сообщения, соответствующую самому старому сообщению в очереди MessagePort.

import { MessageChannel, receiveMessageOnPort } from 'node:worker_threads';
const { port1, port2 } = new MessageChannel();
port1.postMessage({ hello: 'world' });

console.log(receiveMessageOnPort(port2));
// Prints: { message: { hello: 'world' } }
console.log(receiveMessageOnPort(port2));
// Prints: undefined

При использовании этой функции событие 'message' не генерируется, а обработчик onmessage не вызывается.

Параметры

port: MessagePort

Тип возвращаемого значения

{ message: any; } | undefined

функция setEnvironmentData

Использование в Deno

import { setEnvironmentData } from "node:worker_threads";
setEnvironmentData(
key: Serializable,
value: Serializable,
): void

API worker.setEnvironmentData() задаёт содержимое worker.getEnvironmentData() в текущем потоке и во всех новых экземплярах Worker, созданных в текущем контексте.

Параметры

key: Serializable

Любое произвольное клонируемое значение JavaScript, которое можно использовать в качестве ключа {Map}.

value: Serializable

Любое произвольное клонируемое значение JavaScript, которое будет клонировано и автоматически передано всем новым экземплярам Worker. Если value передано в качестве undefined, ранее заданное значение для key будет удалено.

Тип возвращаемого значения

void

класс BroadcastChannel

Использование в Deno

import { BroadcastChannel } from "node:worker_threads";

Экземпляры BroadcastChannel обеспечивают асинхронную связь «один ко многим» со всеми остальными экземплярами BroadcastChannel, привязанными к тому же имени канала.

'use strict';

import {
  isMainThread,
  BroadcastChannel,
  Worker,
} from 'node:worker_threads';

const bc = new BroadcastChannel('hello');

if (isMainThread) {
  let c = 0;
  bc.onmessage = (event) => {
    console.log(event.data);
    if (++c === 10) bc.close();
  };
  for (let n = 0; n < 10; n++)
    new Worker(__filename);
} else {
  bc.postMessage('hello from every worker');
  bc.close();
}

Конструкторы

BroadcastChannel(name: string)
новый

Свойства

name: string
только для чтения
onmessage: (message: unknown) => void

Вызывается с единственным аргументом `MessageEvent` при получении сообщения.

onmessageerror: (message: unknown) => void

Вызывается, если полученное сообщение не удаётся десериализовать.

Методы

close(): void

Закрывает соединение BroadcastChannel.

postMessage(message: unknown): void

интерфейс BroadcastChannel

расширяет [NodeJS.RefCounted]

переменная BroadcastChannel

Класс BroadcastChannel является глобальной ссылкой на import { BroadcastChannel } from 'worker_threads' https://nodejs.org/api/globals.html#broadcastchannel

Тип

globalThis extends { onmessage: any; BroadcastChannel: infer T; } ? T : _BroadcastChannel

интерфейс ResourceLimits

Использование в Deno

import { type ResourceLimits } from "node:worker_threads";

Свойства

maxYoungGenerationSizeMb: number | undefined
необязательный

Максимальный размер области кучи для недавно созданных объектов.

maxOldGenerationSizeMb: number | undefined
необязательный

Максимальный размер основной кучи в МБ.

codeRangeSizeMb: number | undefined
необязательный

Размер предварительно выделенного диапазона памяти, используемого для сгенерированного кода.

stackSizeMb: number | undefined
необязательный

Максимальный размер стека потока по умолчанию. Небольшие значения могут привести к невозможности использования экземпляров Worker.


интерфейс WorkerOptions

Использование в Deno

import { type WorkerOptions } from "node:worker_threads";

Свойства

argv: any[] | undefined
необязательный

Список аргументов, которые будут преобразованы в строки и добавлены к process.argv в рабочем потоке. Это во многом аналогично workerData, но значения будут доступны в глобальном process.argv, как если бы они были переданы скрипту в качестве параметров командной строки.

env:
Dict<string>
| SHARE_ENV
| undefined
необязательный
eval: boolean | undefined
необязательный
workerData: any
необязательный
stdin: boolean | undefined
необязательный
stdout: boolean | undefined
необязательный
stderr: boolean | undefined
необязательный
execArgv: string[] | undefined
необязательный
resourceLimits: ResourceLimits | undefined
необязательный
transferList: TransferListItem[] | undefined
необязательный

Дополнительные данные для отправки в первом сообщении рабочего потока.

trackUnmanagedFds: boolean | undefined
необязательный
name: string | undefined
необязательный

Необязательное name, добавляемое к заголовку рабочего потока для отладки и идентификации; итоговый заголовок будет иметь вид [worker ${id}] ${name}.


интерфейс WorkerPerformance

Использование в Deno

import { type WorkerPerformance } from "node:worker_threads";

Свойства

eventLoopUtilization: EventLoopUtilityFunction

псевдоним типа Serializable

Использование в Deno

import { type Serializable } from "node:worker_threads";

Определение

string
| object
| number
| boolean
| bigint

псевдоним типа TransferListItem

Использование в Deno

import { type TransferListItem } from "node:worker_threads";

Определение

ArrayBuffer
| MessagePort
| FileHandle
| X509Certificate
| Blob

переменная isInternalThread

Использование в Deno

import { isInternalThread } from "node:worker_threads";

Тип

boolean

переменная isMainThread

Использование в Deno

import { isMainThread } from "node:worker_threads";

Тип

boolean

переменная parentPort

Использование в Deno

import { parentPort } from "node:worker_threads";

Тип

null | MessagePort

переменная resourceLimits

Использование в Deno

import { resourceLimits } from "node:worker_threads";

Тип

ResourceLimits

переменная SHARE_ENV

Использование в Deno

import { SHARE_ENV } from "node:worker_threads";

Тип

unique symbol

переменная threadId

Использование в Deno

import { threadId } from "node:worker_threads";

Тип

number

переменная workerData

Использование в Deno

import { workerData } from "node:worker_threads";

Тип

any

© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/api/node/worker_threads

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API