From 8dbc6b210f8ed666cc93f7709141d4ca87367429 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Sat, 24 May 2025 14:03:45 -0700 Subject: [PATCH 1/2] worker: make Worker async disposable PR-URL: https://github.com/nodejs/node/pull/58385 Backport-PR-URL: https://github.com/nodejs/node/pull/58455 Reviewed-By: LiviaMedeiros Reviewed-By: Anna Henningsen Reviewed-By: Matteo Collina Reviewed-By: Daeyeon Jeong Reviewed-By: Yagiz Nizipli --- doc/api/worker_threads.md | 8 ++++++++ lib/internal/worker.js | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/doc/api/worker_threads.md b/doc/api/worker_threads.md index 06b9d488eaff4d..fa6d26a2faee48 100644 --- a/doc/api/worker_threads.md +++ b/doc/api/worker_threads.md @@ -1846,6 +1846,14 @@ Calling `unref()` on a worker allows the thread to exit if this is the only active handle in the event system. If the worker is already `unref()`ed calling `unref()` again has no effect. +### `worker[Symbol.asyncDispose]()` + + + +Alias for [`worker.terminate()`][]. + ## Notes ### Synchronous blocking of stdio diff --git a/lib/internal/worker.js b/lib/internal/worker.js index 22535cc9bcbf49..b1fe97a5b81285 100644 --- a/lib/internal/worker.js +++ b/lib/internal/worker.js @@ -58,7 +58,7 @@ const { const { createMainThreadPort, destroyMainThreadPort } = require('internal/worker/messaging'); const { deserializeError } = require('internal/error_serdes'); const { fileURLToPath, isURL, pathToFileURL } = require('internal/url'); -const { kEmptyObject } = require('internal/util'); +const { kEmptyObject, SymbolAsyncDispose } = require('internal/util'); const { validateArray, validateString } = require('internal/validators'); const { throwIfBuildingSnapshot, @@ -406,6 +406,10 @@ class Worker extends EventEmitter { }); } + async [SymbolAsyncDispose]() { + await this.terminate(); + } + ref() { if (this[kHandle] === null) return; From 66fccc252b44e2e9b7f399f23a5abd3ebda04c46 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Sat, 24 May 2025 14:04:04 -0700 Subject: [PATCH 2/2] test: add test for async disposable worker thread PR-URL: https://github.com/nodejs/node/pull/58385 Backport-PR-URL: https://github.com/nodejs/node/pull/58455 Reviewed-By: LiviaMedeiros Reviewed-By: Anna Henningsen Reviewed-By: Matteo Collina Reviewed-By: Daeyeon Jeong Reviewed-By: Yagiz Nizipli --- test/parallel/test-worker-dispose.mjs | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 test/parallel/test-worker-dispose.mjs diff --git a/test/parallel/test-worker-dispose.mjs b/test/parallel/test-worker-dispose.mjs new file mode 100644 index 00000000000000..1c426cc3403f31 --- /dev/null +++ b/test/parallel/test-worker-dispose.mjs @@ -0,0 +1,9 @@ +import * as common from '../common/index.mjs'; +import { Worker } from 'node:worker_threads'; + +{ + // Verifies that the worker is async disposable + const worker = new Worker('for(;;) {}', { eval: true }); + worker.on('exit', common.mustCall()); + await worker[Symbol.asyncDispose](); +}