Skip to content

Commit 2849e7d

Browse files
committed
Test for core count of 0 results in useless worker pool
1 parent 1cf749a commit 2849e7d

3 files changed

Lines changed: 32 additions & 4 deletions

File tree

src/WorkerManager.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ class WorkerManager<W extends ModuleMethods>
1919
* The `workerPath` can be either an absolute path or relative path
2020
* If it is a relative path, it has to be relative to the file location where
2121
* the function expression is defined
22+
* If `cores` is set to 0, this creates a useless worker pool
23+
* Use `undefined` to mean using all cores
2224
*/
2325
public static async createWorkerManager<W extends ModuleMethods>({
2426
workerFactory,
@@ -64,12 +66,14 @@ class WorkerManager<W extends ModuleMethods>
6466
return this._destroyed;
6567
}
6668

67-
public async destroy(): Promise<void> {
69+
public async destroy({
70+
force = false,
71+
}: { force?: boolean } = {}): Promise<void> {
6872
if (this._destroyed) {
6973
return;
7074
}
7175
this.logger.info('Destroying WorkerManager');
72-
await this.pool.terminate();
76+
await this.pool.terminate(force);
7377
this._running = false;
7478
this._destroyed = true;
7579
this.logger.info('Destroyed WorkerManager');

tests/WorkerManager.test.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import type { WorkerModule } from '@/worker';
2-
2+
import os from 'os';
33
import { spawn, Worker, Transfer } from 'threads';
44
import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
55
import WorkerManager from '@/WorkerManager';
66
import * as errors from '@/errors';
7+
import * as testUtils from './utils';
78

89
describe('WorkerManager', () => {
910
const logger = new Logger('WorkerManager Test', LogLevel.WARN, [
@@ -26,7 +27,25 @@ describe('WorkerManager', () => {
2627
errors.ErrorWorkerManagerNotRunning,
2728
);
2829
});
29-
test('start with just 1 worker core', async () => {
30+
test('starting with 0 worker cores is useless', async () => {
31+
const workerManager = await WorkerManager.createWorkerManager<WorkerModule>(
32+
{
33+
workerFactory: () => spawn(new Worker('../src/worker')),
34+
cores: 0,
35+
logger,
36+
},
37+
);
38+
// The call will never resolve, so we timeout in 1 second
39+
expect(
40+
await Promise.race([
41+
workerManager.call(async () => 1),
42+
testUtils.sleep(1000),
43+
]),
44+
).not.toBe(1);
45+
// Force destory because of the pending call that never resolves
46+
await workerManager.destroy({ force: true });
47+
});
48+
test('start with 1 worker core', async () => {
3049
const workerManager = await WorkerManager.createWorkerManager<WorkerModule>(
3150
{
3251
workerFactory: () => spawn(new Worker('../src/worker')),

tests/utils.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
async function sleep(ms: number) {
2+
return await new Promise((r) => setTimeout(r, ms));
3+
}
4+
5+
export { sleep };

0 commit comments

Comments
 (0)