@@ -4,10 +4,8 @@ import url from 'url';
4
4
import path from 'node:path' ;
5
5
import Logger , { LogLevel , StreamHandler } from '@matrixai/logger' ;
6
6
import { destroyed } from '@matrixai/async-init' ;
7
- import * as testUtils from './utils.js' ;
8
7
import WorkerManager from '#WorkerManager.js' ;
9
8
import * as errors from '#errors.js' ;
10
- import WorkerPool from '#WorkerPool.js' ;
11
9
12
10
const dirname = url . fileURLToPath ( new URL ( '.' , import . meta. url ) ) ;
13
11
@@ -20,150 +18,97 @@ describe('WorkerManager', () => {
20
18
return new Worker ( path . join ( dirname , '../dist/worker.js' ) ) ;
21
19
} ;
22
20
21
+ let workerManager : WorkerManager ;
22
+
23
+ afterEach ( async ( ) => {
24
+ await workerManager ?. destroy ( ) ;
25
+ } ) ;
26
+
23
27
test ( 'async construction and async destroy' , async ( ) => {
24
- const workerManager = await WorkerManager . createWorkerManager ( {
25
- workerFactory : ( ) => new Worker ( '../src/worker' ) ,
28
+ workerManager = await WorkerManager . createWorkerManager ( {
29
+ workerFactory,
30
+ cores : 1 ,
26
31
logger,
27
32
} ) ;
28
- console . log ( 'asd' ) ;
29
33
expect ( workerManager [ destroyed ] ) . toBe ( false ) ;
30
- console . log ( 'asd' ) ;
31
- try {
32
- expect ( await workerManager . call ( { type : 'test' , data : undefined } ) ) . toBe (
33
- 'hello world!' ,
34
- ) ;
35
- } catch ( e ) {
36
- console . error ( e ) ;
37
- throw e ;
38
- }
39
- console . log ( 'asd' ) ;
34
+ expect ( await workerManager . call ( { type : 'test' , data : undefined } ) ) . toBe (
35
+ 'hello world!' ,
36
+ ) ;
40
37
await workerManager . destroy ( ) ;
41
- console . log ( 'asd' ) ;
42
38
expect ( workerManager [ destroyed ] ) . toBe ( true ) ;
43
- console . log ( 'asd' ) ;
44
39
await expect (
45
40
workerManager . call ( { type : 'test' , data : undefined } ) ,
46
41
) . rejects . toThrow ( errors . ErrorWorkerManagerDestroyed ) ;
47
- console . log ( 'asd' ) ;
48
42
} ) ;
49
-
50
- // Test('starting with 0 worker cores is useless', async () => {
51
- // const workerManager = await WorkerManager.createWorkerManager<WorkerModule>(
52
- // {
53
- // workerFactory: () => spawn(new Worker('../src/worker')),
54
- // cores: 0,
55
- // logger,
56
- // },
57
- // );
58
- // // The call will never resolve, so we timeout in 1 second
59
- // expect(
60
- // await Promise.race([
61
- // workerManager.call(async () => 1),
62
- // testUtils.sleep(1000),
63
- // ]),
64
- // ).not.toBe(1);
65
- // // Force destory because of the pending call that never resolves
66
- // await workerManager.destroy({ force: true });
67
- // });
68
-
69
- // test('start with 1 worker core', async () => {
70
- // const workerManager = await WorkerManager.createWorkerManager<WorkerModule>(
71
- // {
72
- // workerFactory: () => spawn(new Worker('../src/worker')),
73
- // cores: 1,
74
- // logger,
75
- // },
76
- // );
77
- // expect(await workerManager.call(async () => 1)).toBe(1);
78
- // await workerManager.destroy();
79
- // });
80
-
81
- // test('call runs in the main thread', async () => {
82
- // const mainPid1 = process.pid;
83
- // const workerManager = await WorkerManager.createWorkerManager<WorkerModule>(
84
- // {
85
- // workerFactory: () => spawn(new Worker('../src/worker')),
86
- // cores: 1,
87
- // logger,
88
- // },
89
- // );
90
- // let mainPid2: number;
91
- // let mainPid3: number;
92
- // // Only `w.f()` functions are running in the worker threads
93
- // // the callback passed to `call` is still running in the main thread
94
- // expect(
95
- // await workerManager.call(async (w) => {
96
- // mainPid2 = process.pid;
97
- // const process2 = await import('node:process');
98
- // mainPid3 = process2.pid;
99
- // return await w.isRunningInWorker();
100
- // }),
101
- // ).toBe(true);
102
- // await workerManager.destroy();
103
- // expect(mainPid2!).toBe(mainPid1);
104
- // expect(mainPid3!).toBe(mainPid1);
105
- // });
106
-
107
- // test('can await a subset of tasks', async () => {
108
- // // Use all possible cores
109
- // // if you only use 1 core, this test will be much slower
110
- // const workerManager = await WorkerManager.createWorkerManager<WorkerModule>(
111
- // {
112
- // workerFactory: () => spawn(new Worker('../src/worker')),
113
- // logger,
114
- // },
115
- // );
116
- // const task = workerManager.call(async (w) => {
117
- // return await w.sleep(500);
118
- // });
119
- // const taskCount = 5;
120
- // const tasks: Array<Promise<unknown>> = [];
121
- // for (let i = 0; i < taskCount; i++) {
122
- // tasks.push(
123
- // workerManager.call(async (w) => {
124
- // return await w.sleep(500);
125
- // }),
126
- // );
127
- // }
128
- // const rs = await Promise.all(tasks);
129
- // expect(rs.length).toBe(taskCount);
130
- // expect(rs.every((x) => x === undefined)).toBe(true);
131
- // const r = await task;
132
- // expect(r).toBeUndefined();
133
- // await workerManager.destroy();
134
- // });
135
-
136
- // test('queueing up tasks', async () => {
137
- // // Use all possible cores
138
- // // if you only use 1 core, this test will be much slower
139
- // const workerManager = await WorkerManager.createWorkerManager<WorkerModule>(
140
- // {
141
- // workerFactory: () => spawn(new Worker('../src/worker')),
142
- // logger,
143
- // },
144
- // );
145
- // const t1 = workerManager.queue(async (w) => await w.sleep(500));
146
- // const t2 = workerManager.queue(async (w) => await w.sleep(500));
147
- // const t3 = workerManager.queue(async (w) => await w.sleep(500));
148
- // const t4 = workerManager.queue(async (w) => await w.sleep(500));
149
- // await workerManager.completed();
150
- // expect(await t1).toBeUndefined();
151
- // expect(await t2).toBeUndefined();
152
- // expect(await t3).toBeUndefined();
153
- // expect(await t4).toBeUndefined();
154
- // void workerManager.queue(async (w) => await w.sleep(500));
155
- // void workerManager.queue(async (w) => await w.sleep(500));
156
- // void workerManager.queue(async (w) => await w.sleep(500));
157
- // void workerManager.queue(async (w) => await w.sleep(500));
158
- // const es = await workerManager.settled();
159
- // expect(es.length).toBe(0);
160
- // await workerManager.destroy();
161
- // });
162
-
163
- // test('zero-copy buffer transfer', async () => {
164
- // const workerManager = await WorkerManager.createWorkerManager<WorkerModule>(
43
+ test ( 'starting with 0 worker cores will throw' , async ( ) => {
44
+ await expect (
45
+ WorkerManager . createWorkerManager ( {
46
+ workerFactory,
47
+ cores : 0 ,
48
+ logger,
49
+ } ) ,
50
+ ) . rejects . toThrow ( errors . ErrorWorkerPoolInvalidWorkers ) ;
51
+ } ) ;
52
+ test ( 'start with 1 worker core' , async ( ) => {
53
+ workerManager = await WorkerManager . createWorkerManager ( {
54
+ workerFactory,
55
+ cores : 1 ,
56
+ logger,
57
+ } ) ;
58
+ expect ( await workerManager . call ( { type : 'test' , data : undefined } ) ) . toBe (
59
+ 'hello world!' ,
60
+ ) ;
61
+ await workerManager . destroy ( ) ;
62
+ } ) ;
63
+ test ( 'can await a subset of tasks' , async ( ) => {
64
+ // Use all possible cores
65
+ // if you only use 1 core, this test will be much slower
66
+ workerManager = await WorkerManager . createWorkerManager ( {
67
+ workerFactory,
68
+ cores : 1 ,
69
+ logger,
70
+ } ) ;
71
+ const task = workerManager . call ( { type : 'sleep' , data : 500 } ) ;
72
+ const taskCount = 5 ;
73
+ const tasks : Array < Promise < unknown > > = [ ] ;
74
+ for ( let i = 0 ; i < taskCount ; i ++ ) {
75
+ tasks . push ( workerManager . call ( { type : 'sleep' , data : 500 } ) ) ;
76
+ }
77
+ const rs = await Promise . all ( tasks ) ;
78
+ expect ( rs . length ) . toBe ( taskCount ) ;
79
+ expect ( rs . every ( ( x ) => x === undefined ) ) . toBe ( true ) ;
80
+ const r = await task ;
81
+ expect ( r ) . toBeUndefined ( ) ;
82
+ await workerManager . destroy ( ) ;
83
+ } ) ;
84
+ test ( 'queueing up tasks' , async ( ) => {
85
+ // Use all possible cores
86
+ // if you only use 1 core, this test will be much slower
87
+ workerManager = await WorkerManager . createWorkerManager ( {
88
+ workerFactory,
89
+ cores : 1 ,
90
+ logger,
91
+ } ) ;
92
+ const t1 = workerManager . queue ( { type : 'sleep' , data : 500 } ) ;
93
+ const t2 = workerManager . queue ( { type : 'sleep' , data : 500 } ) ;
94
+ const t3 = workerManager . queue ( { type : 'sleep' , data : 500 } ) ;
95
+ const t4 = workerManager . queue ( { type : 'sleep' , data : 500 } ) ;
96
+ await workerManager . completed ( ) ;
97
+ expect ( await t1 ) . toBeUndefined ( ) ;
98
+ expect ( await t2 ) . toBeUndefined ( ) ;
99
+ expect ( await t3 ) . toBeUndefined ( ) ;
100
+ expect ( await t4 ) . toBeUndefined ( ) ;
101
+ void workerManager . queue ( { type : 'sleep' , data : 500 } ) ;
102
+ void workerManager . queue ( { type : 'sleep' , data : 500 } ) ;
103
+ void workerManager . queue ( { type : 'sleep' , data : 500 } ) ;
104
+ void workerManager . queue ( { type : 'sleep' , data : 500 } ) ;
105
+ await workerManager . settled ( ) ;
106
+ await workerManager . destroy ( ) ;
107
+ } ) ;
108
+ // Test('zero-copy buffer transfer', async () => {
109
+ // workerManager = await WorkerManager.createWorkerManager(
165
110
// {
166
- // workerFactory: () => spawn(new Worker('../src/worker')) ,
111
+ // workerFactory,
167
112
// cores: 1,
168
113
// logger,
169
114
// },
@@ -194,7 +139,6 @@ describe('WorkerManager', () => {
194
139
// expect(buffer).toEqual(Buffer.from('hello 2'));
195
140
// await workerManager.destroy();
196
141
// });
197
-
198
142
// test('scratch', async () => {
199
143
// console.log('start');
200
144
// console.log(
0 commit comments