Skip to content

Commit 658a86f

Browse files
committed
workers: make Worker async disposable
```js await using worker = new Worker(...); ```
1 parent 20c4b80 commit 658a86f

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

doc/api/worker_threads.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1861,6 +1861,21 @@ Calling `unref()` on a worker allows the thread to exit if this is the only
18611861
active handle in the event system. If the worker is already `unref()`ed calling
18621862
`unref()` again has no effect.
18631863

1864+
### `worker[Symbol.asyncDispose]()`
1865+
1866+
<!-- YAML
1867+
added: REPLACEME
1868+
-->
1869+
1870+
Calls [`worker.terminate()`][] when the dispose scope is exited.
1871+
1872+
```js
1873+
async function example() {
1874+
await using worker = new Worker('for (;;) {}', { eval: true });
1875+
// Worker is automatically terminate when the scope is exited.
1876+
}
1877+
```
1878+
18641879
## Notes
18651880

18661881
### Synchronous blocking of stdio

lib/internal/worker.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const {
1919
String,
2020
StringPrototypeTrim,
2121
Symbol,
22+
SymbolAsyncDispose,
2223
SymbolFor,
2324
TypedArrayPrototypeFill,
2425
Uint32Array,
@@ -407,6 +408,10 @@ class Worker extends EventEmitter {
407408
});
408409
}
409410

411+
async [SymbolAsyncDispose]() {
412+
await this.terminate();
413+
}
414+
410415
ref() {
411416
if (this[kHandle] === null) return;
412417

test/parallel/test-worker-dispose.mjs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import * as common from '../common/index.mjs';
2+
import { Worker } from 'node:worker_threads';
3+
4+
let w;
5+
{
6+
// Verifies that the worker is async disposable
7+
await using worker = new Worker('for(;;) {}', { eval: true });
8+
w = worker;
9+
w.on('exit', common.mustCall());
10+
}

0 commit comments

Comments
 (0)