stardust-parallel-js 1.0.9 β 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -55
- package/README.ru.md +52 -54
- package/dist/primitives/Thread.d.ts.map +1 -1
- package/dist/primitives/Thread.js +7 -6
- package/dist/primitives/Thread.js.map +1 -1
- package/dist/primitives/ThreadPool.d.ts.map +1 -1
- package/dist/primitives/ThreadPool.js +9 -7
- package/dist/primitives/ThreadPool.js.map +1 -1
- package/dist/utils/extractTransferables.d.ts +3 -0
- package/dist/utils/extractTransferables.d.ts.map +1 -0
- package/dist/utils/extractTransferables.js +24 -0
- package/dist/utils/extractTransferables.js.map +1 -0
- package/dist/utils/workerFactory.d.ts +5 -2
- package/dist/utils/workerFactory.d.ts.map +1 -1
- package/dist/utils/workerFactory.js +6 -1
- package/dist/utils/workerFactory.js.map +1 -1
- package/package.json +11 -8
package/README.md
CHANGED
|
@@ -3,40 +3,38 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/stardust-parallel-js)
|
|
4
4
|
[](https://www.npmjs.com/package/stardust-parallel-js)
|
|
5
5
|
[](https://opensource.org/licenses/MIT)
|
|
6
|
-
[](https://github.com/b1411/parallel.js)
|
|
7
7
|
[](https://nodejs.org)
|
|
8
8
|
[](https://www.typescriptlang.org/)
|
|
9
9
|
[](https://bundlephobia.com/package/stardust-parallel-js)
|
|
10
10
|
[](https://github.com/b1411/parallel.js)
|
|
11
11
|
|
|
12
|
-
>
|
|
13
|
-
|
|
14
|
-
**Speed up your Node.js applications up to 3x** with a simple API for parallel task execution!
|
|
12
|
+
> **Other languages:** [Π ΡΡΡΠΊΠΈΠΉ](./README.ru.md)
|
|
15
13
|
|
|
16
14
|
A library for parallel execution of JavaScript/TypeScript functions using Worker Threads in Node.js.
|
|
17
15
|
|
|
18
|
-
##
|
|
16
|
+
## Performance
|
|
19
17
|
|
|
20
|
-
|
|
18
|
+
Benchmarks on 4-core CPU:
|
|
21
19
|
|
|
22
20
|
| Task | Sequential | Parallel (4 workers) | Speedup |
|
|
23
21
|
|------|-----------|---------------------|---------|
|
|
24
|
-
| **Fibonacci(35-42) computation** | 5113 ms | 2606 ms | **1.96x**
|
|
25
|
-
| **Processing 50 items** | 936 ms | 344 ms | **2.72x**
|
|
22
|
+
| **Fibonacci(35-42) computation** | 5113 ms | 2606 ms | **1.96x** |
|
|
23
|
+
| **Processing 50 items** | 936 ms | 344 ms | **2.72x** |
|
|
26
24
|
|
|
27
|
-
>
|
|
25
|
+
> Performance improvement: up to 63% on CPU-intensive tasks.
|
|
28
26
|
|
|
29
|
-
##
|
|
27
|
+
## Features
|
|
30
28
|
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
29
|
+
- Real speedup on multi-core processors
|
|
30
|
+
- Simple API for parallel task execution
|
|
31
|
+
- Thread pool for efficient resource management
|
|
32
|
+
- Single thread support for one-off tasks
|
|
33
|
+
- Full TypeScript support
|
|
34
|
+
- Automatic recovery of crashed threads
|
|
35
|
+
- Array processing similar to `map()`, but parallel
|
|
38
36
|
|
|
39
|
-
##
|
|
37
|
+
## Installation
|
|
40
38
|
|
|
41
39
|
```bash
|
|
42
40
|
npm install stardust-parallel-js
|
|
@@ -46,27 +44,25 @@ pnpm install stardust-parallel-js
|
|
|
46
44
|
yarn add stardust-parallel-js
|
|
47
45
|
```
|
|
48
46
|
|
|
49
|
-
##
|
|
47
|
+
## Quick Start
|
|
50
48
|
|
|
51
|
-
|
|
49
|
+
Basic usage example:
|
|
52
50
|
|
|
53
51
|
```typescript
|
|
54
52
|
import { ThreadPool } from 'stardust-parallel-js';
|
|
55
53
|
|
|
56
54
|
const pool = new ThreadPool(4);
|
|
57
55
|
|
|
58
|
-
//
|
|
56
|
+
// Sequential execution
|
|
59
57
|
const results = data.map(item => heavyComputation(item));
|
|
60
58
|
|
|
61
|
-
//
|
|
59
|
+
// Parallel execution
|
|
62
60
|
const results = await pool.map(data, item => heavyComputation(item));
|
|
63
61
|
|
|
64
62
|
await pool.terminate();
|
|
65
63
|
```
|
|
66
64
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
## π Usage
|
|
65
|
+
## Usage
|
|
70
66
|
|
|
71
67
|
### ThreadPool - Thread pool (recommended)
|
|
72
68
|
|
|
@@ -78,12 +74,12 @@ import { ThreadPool } from 'stardust-parallel-js';
|
|
|
78
74
|
// Create a pool of 4 threads (matching CPU cores)
|
|
79
75
|
const pool = new ThreadPool(4);
|
|
80
76
|
|
|
81
|
-
//
|
|
77
|
+
// Process array in parallel
|
|
82
78
|
const numbers = [1, 2, 3, 4, 5, 6, 7, 8];
|
|
83
79
|
const squares = await pool.map(numbers, (n: number) => n * n);
|
|
84
80
|
console.log(squares); // [1, 4, 9, 16, 25, 36, 49, 64]
|
|
85
81
|
|
|
86
|
-
//
|
|
82
|
+
// CPU-intensive computations
|
|
87
83
|
const result = await pool.execute(
|
|
88
84
|
(n: number) => {
|
|
89
85
|
let sum = 0;
|
|
@@ -120,7 +116,7 @@ const thread2 = new Thread(x => x * 2, [21]);
|
|
|
120
116
|
console.log(await thread2.join()); // 42
|
|
121
117
|
```
|
|
122
118
|
|
|
123
|
-
##
|
|
119
|
+
## Examples
|
|
124
120
|
|
|
125
121
|
### Image Processing
|
|
126
122
|
|
|
@@ -171,9 +167,9 @@ const results = await pool.map([35, 36, 37, 38, 39, 40], n => {
|
|
|
171
167
|
await pool.terminate();
|
|
172
168
|
```
|
|
173
169
|
|
|
174
|
-
##
|
|
170
|
+
## Benchmarks
|
|
175
171
|
|
|
176
|
-
Run
|
|
172
|
+
Run benchmarks:
|
|
177
173
|
|
|
178
174
|
```bash
|
|
179
175
|
npm run build
|
|
@@ -181,7 +177,7 @@ npx tsx benchmarks/cpu-intensive.ts
|
|
|
181
177
|
npx tsx benchmarks/data-processing.ts
|
|
182
178
|
```
|
|
183
179
|
|
|
184
|
-
##
|
|
180
|
+
## API Reference
|
|
185
181
|
|
|
186
182
|
### ThreadPool
|
|
187
183
|
|
|
@@ -233,31 +229,31 @@ Waits for execution to complete and returns the result. Automatically terminates
|
|
|
233
229
|
const result = await thread.join();
|
|
234
230
|
```
|
|
235
231
|
|
|
236
|
-
##
|
|
232
|
+
## Important Notes
|
|
237
233
|
|
|
238
|
-
-
|
|
239
|
-
-
|
|
240
|
-
-
|
|
241
|
-
-
|
|
242
|
-
-
|
|
243
|
-
-
|
|
244
|
-
-
|
|
234
|
+
- Functions execute in an isolated context (separate Worker Thread)
|
|
235
|
+
- Arguments and results must be serializable
|
|
236
|
+
- Closures don't work - functions have no access to external variables
|
|
237
|
+
- Regular and arrow functions are supported
|
|
238
|
+
- `require()` is available inside functions for using Node.js modules
|
|
239
|
+
- Best suited for CPU-intensive tasks (calculations, data processing)
|
|
240
|
+
- For I/O operations (reading files, network) use async/await instead of threads
|
|
245
241
|
|
|
246
|
-
##
|
|
242
|
+
## When to Use
|
|
247
243
|
|
|
248
|
-
|
|
244
|
+
**Use stardust-parallel-js when:**
|
|
249
245
|
- Processing large data arrays
|
|
250
246
|
- Performing complex calculations
|
|
251
247
|
- Parsing or transforming data
|
|
252
248
|
- Processing images/video
|
|
253
249
|
- Need to utilize all CPU cores
|
|
254
250
|
|
|
255
|
-
|
|
251
|
+
**Don't use when:**
|
|
256
252
|
- Simple operations (faster to execute sequentially)
|
|
257
253
|
- I/O operations (files, network, DB) - they're already asynchronous
|
|
258
254
|
- Working with DOM (Node.js only)
|
|
259
255
|
|
|
260
|
-
##
|
|
256
|
+
## Choosing Pool Size
|
|
261
257
|
|
|
262
258
|
```typescript
|
|
263
259
|
import os from 'os';
|
|
@@ -272,16 +268,16 @@ const pool = new ThreadPool(os.cpus().length - 1); // leave 1 core for system
|
|
|
272
268
|
const pool = new ThreadPool(os.cpus().length * 2);
|
|
273
269
|
```
|
|
274
270
|
|
|
275
|
-
##
|
|
271
|
+
## Comparison with Alternatives
|
|
276
272
|
|
|
277
273
|
| Solution | Simplicity | Performance | TypeScript | Size |
|
|
278
274
|
|----------|-----------|-------------|------------|------|
|
|
279
|
-
| **stardust-parallel-js** |
|
|
280
|
-
| worker_threads |
|
|
281
|
-
| cluster |
|
|
282
|
-
| child_process |
|
|
275
|
+
| **stardust-parallel-js** | High | High | Full | 9.3kB |
|
|
276
|
+
| worker_threads | Medium | High | Partial | Built-in |
|
|
277
|
+
| cluster | Medium | Medium | Partial | Built-in |
|
|
278
|
+
| child_process | Low | Low | No | Built-in |
|
|
283
279
|
|
|
284
|
-
##
|
|
280
|
+
## Roadmap
|
|
285
281
|
|
|
286
282
|
- [ ] Support for transferable objects for large data
|
|
287
283
|
- [ ] Automatic selection of optimal pool size
|
|
@@ -289,17 +285,15 @@ const pool = new ThreadPool(os.cpus().length * 2);
|
|
|
289
285
|
- [ ] Monitoring and statistics
|
|
290
286
|
- [ ] Support for async functions in threads
|
|
291
287
|
|
|
292
|
-
##
|
|
293
|
-
|
|
294
|
-
Found a bug? Have an idea? [Create an issue](https://github.com/b1411/parallel.js)!
|
|
288
|
+
## Feedback
|
|
295
289
|
|
|
296
|
-
|
|
290
|
+
Found a bug or have an idea? [Create an issue](https://github.com/b1411/parallel.js).
|
|
297
291
|
|
|
298
|
-
##
|
|
292
|
+
## Requirements
|
|
299
293
|
|
|
300
294
|
- Node.js >= 14.0.0 (with Worker Threads support)
|
|
301
295
|
|
|
302
|
-
##
|
|
296
|
+
## License
|
|
303
297
|
|
|
304
298
|
MIT Β© [b1411](https://github.com/b1411)
|
|
305
299
|
|
|
@@ -308,3 +302,5 @@ MIT Β© [b1411](https://github.com/b1411)
|
|
|
308
302
|
<p align="center">
|
|
309
303
|
Made with β€οΈ for the Node.js community
|
|
310
304
|
</p>
|
|
305
|
+
|
|
306
|
+
|
package/README.ru.md
CHANGED
|
@@ -3,38 +3,38 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/stardust-parallel-js)
|
|
4
4
|
[](https://www.npmjs.com/package/stardust-parallel-js)
|
|
5
5
|
[](https://opensource.org/licenses/MIT)
|
|
6
|
-
[](https://github.com/b1411/parallel.js)
|
|
7
7
|
[](https://nodejs.org)
|
|
8
8
|
[](https://www.typescriptlang.org/)
|
|
9
9
|
[](https://bundlephobia.com/package/stardust-parallel-js)
|
|
10
10
|
[](https://github.com/b1411/parallel.js)
|
|
11
11
|
|
|
12
|
-
>
|
|
12
|
+
> **ΠΡΡΠ³ΠΈΠ΅ ΡΠ·ΡΠΊΠΈ:** [English](./README.md)
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ JavaScript/TypeScript ΡΡΠ½ΠΊΡΠΈΠΉ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Worker Threads Π² Node.js.
|
|
15
15
|
|
|
16
|
-
##
|
|
16
|
+
## ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
ΠΠ΅Π½ΡΠΌΠ°ΡΠΊΠΈ Π½Π° 4-ΡΠ΄Π΅ΡΠ½ΠΎΠΌ CPU:
|
|
19
19
|
|
|
20
20
|
| ΠΠ°Π΄Π°ΡΠ° | ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ | ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ (4 ΠΏΠΎΡΠΎΠΊΠ°) | Π£ΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ |
|
|
21
21
|
|--------|----------------|------------------------|-----------|
|
|
22
|
-
| **ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Fibonacci(35-42)** | 5113 ΠΌΡ | 2606 ΠΌΡ | **1.96x**
|
|
23
|
-
| **ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° 50 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²** | 936 ΠΌΡ | 344 ΠΌΡ | **2.72x**
|
|
22
|
+
| **ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Fibonacci(35-42)** | 5113 ΠΌΡ | 2606 ΠΌΡ | **1.96x** |
|
|
23
|
+
| **ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° 50 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²** | 936 ΠΌΡ | 344 ΠΌΡ | **2.72x** |
|
|
24
24
|
|
|
25
|
-
>
|
|
25
|
+
> Π£Π»ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ: Π΄ΠΎ 63% Π½Π° CPU-ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΡΡ
Π·Π°Π΄Π°ΡΠ°Ρ
.
|
|
26
26
|
|
|
27
|
-
##
|
|
27
|
+
## ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
|
|
28
28
|
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
29
|
+
- Π Π΅Π°Π»ΡΠ½ΠΎΠ΅ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΡΠ΄Π΅ΡΠ½ΡΡ
ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°Ρ
|
|
30
|
+
- ΠΡΠΎΡΡΠΎΠΉ API Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ
|
|
31
|
+
- ΠΡΠ» ΠΏΠΎΡΠΎΠΊΠΎΠ² Π΄Π»Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ
|
|
32
|
+
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ
ΠΏΠΎΡΠΎΠΊΠΎΠ² Π΄Π»Ρ ΡΠ°Π·ΠΎΠ²ΡΡ
Π·Π°Π΄Π°Ρ
|
|
33
|
+
- ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° TypeScript
|
|
34
|
+
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΠ°Π²ΡΠΈΡ
ΠΏΠΎΡΠΎΠΊΠΎΠ²
|
|
35
|
+
- ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ `map()`, Π½ΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ
|
|
36
36
|
|
|
37
|
-
##
|
|
37
|
+
## Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
40
|
npm install stardust-parallel-js
|
|
@@ -44,27 +44,25 @@ pnpm install stardust-parallel-js
|
|
|
44
44
|
yarn add stardust-parallel-js
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
##
|
|
47
|
+
## ΠΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
ΠΡΠΈΠΌΠ΅Ρ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
|
|
50
50
|
|
|
51
51
|
```typescript
|
|
52
52
|
import { ThreadPool } from 'stardust-parallel-js';
|
|
53
53
|
|
|
54
54
|
const pool = new ThreadPool(4);
|
|
55
55
|
|
|
56
|
-
//
|
|
56
|
+
// ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
|
|
57
57
|
const results = data.map(item => heavyComputation(item));
|
|
58
58
|
|
|
59
|
-
//
|
|
59
|
+
// ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
|
|
60
60
|
const results = await pool.map(data, item => heavyComputation(item));
|
|
61
61
|
|
|
62
62
|
await pool.terminate();
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
## π ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
|
|
65
|
+
## ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
|
|
68
66
|
|
|
69
67
|
### ThreadPool - ΠΡΠ» ΠΏΠΎΡΠΎΠΊΠΎΠ² (ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ)
|
|
70
68
|
|
|
@@ -76,12 +74,12 @@ import { ThreadPool } from 'stardust-parallel-js';
|
|
|
76
74
|
// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡΠ» ΠΈΠ· 4 ΠΏΠΎΡΠΎΠΊΠΎΠ² (ΠΏΠΎ ΡΠΈΡΠ»Ρ ΡΠ΄Π΅Ρ CPU)
|
|
77
75
|
const pool = new ThreadPool(4);
|
|
78
76
|
|
|
79
|
-
//
|
|
77
|
+
// ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΌΠ°ΡΡΠΈΠ²Π° ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ
|
|
80
78
|
const numbers = [1, 2, 3, 4, 5, 6, 7, 8];
|
|
81
79
|
const squares = await pool.map(numbers, (n: number) => n * n);
|
|
82
80
|
console.log(squares); // [1, 4, 9, 16, 25, 36, 49, 64]
|
|
83
81
|
|
|
84
|
-
//
|
|
82
|
+
// CPU-ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ
|
|
85
83
|
const result = await pool.execute(
|
|
86
84
|
(n: number) => {
|
|
87
85
|
let sum = 0;
|
|
@@ -118,7 +116,7 @@ const thread2 = new Thread(x => x * 2, [21]);
|
|
|
118
116
|
console.log(await thread2.join()); // 42
|
|
119
117
|
```
|
|
120
118
|
|
|
121
|
-
##
|
|
119
|
+
## ΠΡΠΈΠΌΠ΅ΡΡ
|
|
122
120
|
|
|
123
121
|
### ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
|
|
124
122
|
|
|
@@ -169,9 +167,9 @@ const results = await pool.map([35, 36, 37, 38, 39, 40], n => {
|
|
|
169
167
|
await pool.terminate();
|
|
170
168
|
```
|
|
171
169
|
|
|
172
|
-
##
|
|
170
|
+
## ΠΠ΅Π½ΡΠΌΠ°ΡΠΊΠΈ
|
|
173
171
|
|
|
174
|
-
|
|
172
|
+
ΠΠ°ΠΏΡΡΠΊ Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠΎΠ²:
|
|
175
173
|
|
|
176
174
|
```bash
|
|
177
175
|
npm run build
|
|
@@ -179,7 +177,7 @@ npx tsx benchmarks/cpu-intensive.ts
|
|
|
179
177
|
npx tsx benchmarks/data-processing.ts
|
|
180
178
|
```
|
|
181
179
|
|
|
182
|
-
##
|
|
180
|
+
## API Reference
|
|
183
181
|
|
|
184
182
|
### ThreadPool
|
|
185
183
|
|
|
@@ -234,31 +232,31 @@ const thread = new Thread((x: number) => x * x, [5]);
|
|
|
234
232
|
const result = await thread.join();
|
|
235
233
|
```
|
|
236
234
|
|
|
237
|
-
##
|
|
235
|
+
## ΠΠ°ΠΆΠ½ΡΠ΅ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΡ
|
|
238
236
|
|
|
239
|
-
-
|
|
240
|
-
-
|
|
241
|
-
-
|
|
242
|
-
-
|
|
243
|
-
-
|
|
244
|
-
-
|
|
245
|
-
-
|
|
237
|
+
- Π€ΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ (ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ Worker Thread)
|
|
238
|
+
- ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΠ΅ΠΌΡΠΌΠΈ
|
|
239
|
+
- ΠΠ°ΠΌΡΠΊΠ°Π½ΠΈΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ - ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π²Π½Π΅ΡΠ½ΠΈΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ
|
|
240
|
+
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΠΈ ΡΡΡΠ΅Π»ΠΎΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
|
|
241
|
+
- `require()` Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π²Π½ΡΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Node.js ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ
|
|
242
|
+
- ΠΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ CPU-ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΡΡ
Π·Π°Π΄Π°Ρ (Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ
)
|
|
243
|
+
- ΠΠ»Ρ I/O ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ (ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠ΅ΡΡ) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ async/await Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ²
|
|
246
244
|
|
|
247
|
-
##
|
|
245
|
+
## ΠΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
|
|
248
246
|
|
|
249
|
-
|
|
247
|
+
**ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ stardust-parallel-js ΠΊΠΎΠ³Π΄Π°:**
|
|
250
248
|
- ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²Ρ Π΄Π°Π½Π½ΡΡ
|
|
251
249
|
- ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΡΠ΅ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ
|
|
252
250
|
- ΠΠ°ΡΡΠΈΡΠ΅ ΠΈΠ»ΠΈ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΡΠ΅ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
|
|
253
251
|
- ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ/Π²ΠΈΠ΄Π΅ΠΎ
|
|
254
252
|
- ΠΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΡΠ΄ΡΠ° CPU
|
|
255
253
|
|
|
256
|
-
|
|
254
|
+
**ΠΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠΎΠ³Π΄Π°:**
|
|
257
255
|
- ΠΡΠΎΡΡΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (Π±ΡΡΡΡΠ΅Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ)
|
|
258
256
|
- I/O ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (ΡΠ°ΠΉΠ»Ρ, ΡΠ΅ΡΡ, ΠΠ) - ΠΎΠ½ΠΈ ΡΠΆΠ΅ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠ΅
|
|
259
257
|
- Π Π°Π±ΠΎΡΠ°Π΅ΡΠ΅ Ρ DOM (ΡΠΎΠ»ΡΠΊΠΎ Π² Node.js)
|
|
260
258
|
|
|
261
|
-
##
|
|
259
|
+
## ΠΡΠ±ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΏΡΠ»Π°
|
|
262
260
|
|
|
263
261
|
```typescript
|
|
264
262
|
import os from 'os';
|
|
@@ -273,16 +271,16 @@ const pool = new ThreadPool(os.cpus().length - 1); // ΠΎΡΡΠ°Π²ΠΈΡΡ 1 ΡΠ΄Ρ
|
|
|
273
271
|
const pool = new ThreadPool(os.cpus().length * 2);
|
|
274
272
|
```
|
|
275
273
|
|
|
276
|
-
##
|
|
274
|
+
## Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°ΠΌΠΈ
|
|
277
275
|
|
|
278
276
|
| Π Π΅ΡΠ΅Π½ΠΈΠ΅ | ΠΡΠΎΡΡΠΎΡΠ° | ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ | TypeScript | Π Π°Π·ΠΌΠ΅Ρ |
|
|
279
277
|
|---------|----------|-------------------|------------|--------|
|
|
280
|
-
| **stardust-parallel-js** |
|
|
281
|
-
| worker_threads |
|
|
282
|
-
| cluster |
|
|
283
|
-
| child_process |
|
|
278
|
+
| **stardust-parallel-js** | ΠΡΡΠΎΠΊΠ°Ρ | ΠΡΡΠΎΠΊΠ°Ρ | ΠΠΎΠ»Π½Π°Ρ | 9.3kB |
|
|
279
|
+
| worker_threads | Π‘ΡΠ΅Π΄Π½ΡΡ | ΠΡΡΠΎΠΊΠ°Ρ | Π§Π°ΡΡΠΈΡΠ½Π°Ρ | ΠΡΡΡΠΎΠ΅Π½ΠΎ |
|
|
280
|
+
| cluster | Π‘ΡΠ΅Π΄Π½ΡΡ | Π‘ΡΠ΅Π΄Π½ΡΡ | Π§Π°ΡΡΠΈΡΠ½Π°Ρ | ΠΡΡΡΠΎΠ΅Π½ΠΎ |
|
|
281
|
+
| child_process | ΠΠΈΠ·ΠΊΠ°Ρ | ΠΠΈΠ·ΠΊΠ°Ρ | ΠΠ΅Ρ | ΠΡΡΡΠΎΠ΅Π½ΠΎ |
|
|
284
282
|
|
|
285
|
-
##
|
|
283
|
+
## Roadmap
|
|
286
284
|
|
|
287
285
|
- [ ] ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° transferable objects Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ
Π΄Π°Π½Π½ΡΡ
|
|
288
286
|
- [ ] ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠ±ΠΎΡ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΏΡΠ»Π°
|
|
@@ -290,17 +288,15 @@ const pool = new ThreadPool(os.cpus().length * 2);
|
|
|
290
288
|
- [ ] ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°
|
|
291
289
|
- [ ] ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° async ΡΡΠ½ΠΊΡΠΈΠΉ Π² ΠΏΠΎΡΠΎΠΊΠ°Ρ
|
|
292
290
|
|
|
293
|
-
##
|
|
294
|
-
|
|
295
|
-
ΠΠ°ΡΠ»ΠΈ Π±Π°Π³? ΠΡΡΡ ΠΈΠ΄Π΅Ρ? [Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ issue](https://github.com/b1411/parallel.js)!
|
|
291
|
+
## ΠΠ±ΡΠ°ΡΠ½Π°Ρ ΡΠ²ΡΠ·Ρ
|
|
296
292
|
|
|
297
|
-
|
|
293
|
+
ΠΠ°ΡΠ»ΠΈ Π±Π°Π³ ΠΈΠ»ΠΈ Π΅ΡΡΡ ΠΈΠ΄Π΅Ρ? [Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ issue](https://github.com/b1411/parallel.js).
|
|
298
294
|
|
|
299
|
-
##
|
|
295
|
+
## Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
|
|
300
296
|
|
|
301
297
|
- Node.js >= 14.0.0 (Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Worker Threads)
|
|
302
298
|
|
|
303
|
-
##
|
|
299
|
+
## ΠΠΈΡΠ΅Π½Π·ΠΈΡ
|
|
304
300
|
|
|
305
301
|
MIT Β© [b1411](https://github.com/b1411)
|
|
306
302
|
|
|
@@ -309,3 +305,5 @@ MIT Β© [b1411](https://github.com/b1411)
|
|
|
309
305
|
<p align="center">
|
|
310
306
|
Π‘Π΄Π΅Π»Π°Π½ΠΎ Ρ β€οΈ Π΄Π»Ρ Node.js ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π°
|
|
311
307
|
</p>
|
|
308
|
+
|
|
309
|
+
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Thread.d.ts","sourceRoot":"","sources":["../../src/primitives/Thread.ts"],"names":[],"mappings":"AAGA,cAAM,MAAM,CAAC,CAAC,EAAE,KAAK,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE;IAC/C,OAAO,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"Thread.d.ts","sourceRoot":"","sources":["../../src/primitives/Thread.ts"],"names":[],"mappings":"AAGA,cAAM,MAAM,CAAC,CAAC,EAAE,KAAK,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE;IAC/C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,OAAO,CAAa;gBAEhB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,GAAE,KAA8B;IA0BrE,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC;CAQ3B;AAED,OAAO,EAAE,MAAM,EAAE,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { extractTransferables } from "../utils/extractTransferables.js";
|
|
2
2
|
import { createWorker } from "../utils/workerFactory.js";
|
|
3
3
|
class Thread {
|
|
4
4
|
worker;
|
|
@@ -6,7 +6,7 @@ class Thread {
|
|
|
6
6
|
constructor(fn, args = []) {
|
|
7
7
|
this.worker = createWorker();
|
|
8
8
|
this.promise = new Promise((resolve, reject) => {
|
|
9
|
-
this.worker.on('message', (res) => {
|
|
9
|
+
this.worker.worker.on('message', (res) => {
|
|
10
10
|
if (res.success) {
|
|
11
11
|
resolve(res.result);
|
|
12
12
|
}
|
|
@@ -14,16 +14,17 @@ class Thread {
|
|
|
14
14
|
reject(new Error(res.error));
|
|
15
15
|
}
|
|
16
16
|
});
|
|
17
|
-
this.worker.on('error', (err) => {
|
|
17
|
+
this.worker.worker.on('error', (err) => {
|
|
18
18
|
reject(err);
|
|
19
19
|
});
|
|
20
|
-
this.worker.on('exit', (code) => {
|
|
20
|
+
this.worker.worker.on('exit', (code) => {
|
|
21
21
|
if (code !== 0) {
|
|
22
22
|
reject(new Error(`Worker stopped with exit code ${code}`));
|
|
23
23
|
}
|
|
24
24
|
});
|
|
25
25
|
});
|
|
26
|
-
|
|
26
|
+
const transferables = extractTransferables(args);
|
|
27
|
+
this.worker.run(fn, args, transferables);
|
|
27
28
|
}
|
|
28
29
|
async join() {
|
|
29
30
|
try {
|
|
@@ -31,7 +32,7 @@ class Thread {
|
|
|
31
32
|
return result;
|
|
32
33
|
}
|
|
33
34
|
finally {
|
|
34
|
-
this.worker.terminate();
|
|
35
|
+
this.worker.worker.terminate();
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Thread.js","sourceRoot":"","sources":["../../src/primitives/Thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Thread.js","sourceRoot":"","sources":["../../src/primitives/Thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,MAAM;IACA,MAAM,CAAkC;IACxC,OAAO,CAAa;IAE5B,YAAY,EAAyB,EAAE,OAAc,EAAsB;QACvE,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;QAE7B,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAqD,EAAE,EAAE;gBACvF,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,MAAW,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBACjC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACnC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACnC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAEjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAI;QACN,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAClC,OAAO,MAAM,CAAC;QAClB,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACnC,CAAC;IACL,CAAC;CACJ;AAED,OAAO,EAAE,MAAM,EAAE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadPool.d.ts","sourceRoot":"","sources":["../../src/primitives/ThreadPool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ThreadPool.d.ts","sourceRoot":"","sources":["../../src/primitives/ThreadPool.ts"],"names":[],"mappings":"AAaA,qBAAa,UAAU;IAMP,OAAO,CAAC,IAAI;IALxB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,WAAW,CAAoC;gBAEnC,IAAI,EAAE,MAAM;IAIhC,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,mBAAmB;IA0B3B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,YAAY;IAUd,OAAO,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EAC1C,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,EAC/B,IAAI,GAAE,KAA8B,GACrC,OAAO,CAAC,OAAO,CAAC;IAcb,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAM7D,QAAQ;;;;;;IASF,SAAS;CASlB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Worker } from "node:worker_threads";
|
|
2
2
|
import { createWorker } from "../utils/workerFactory.js";
|
|
3
3
|
import { Queue } from "@datastructures-js/queue";
|
|
4
|
+
import { extractTransferables } from "../utils/extractTransferables.js";
|
|
4
5
|
export class ThreadPool {
|
|
5
6
|
size;
|
|
6
7
|
workers = [];
|
|
@@ -14,9 +15,9 @@ export class ThreadPool {
|
|
|
14
15
|
initWorkers() {
|
|
15
16
|
for (let i = 0; i < this.size; i++) {
|
|
16
17
|
const worker = createWorker();
|
|
17
|
-
this.setupWorkerHandlers(worker);
|
|
18
|
-
this.workers.push(worker);
|
|
19
|
-
this.availableWorkers.push(worker);
|
|
18
|
+
this.setupWorkerHandlers(worker.worker);
|
|
19
|
+
this.workers.push(worker.worker);
|
|
20
|
+
this.availableWorkers.push(worker.worker);
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
23
|
setupWorkerHandlers(worker) {
|
|
@@ -48,9 +49,9 @@ export class ThreadPool {
|
|
|
48
49
|
this.availableWorkers = this.availableWorkers.filter(worker => worker !== crashedWorker);
|
|
49
50
|
crashedWorker.terminate();
|
|
50
51
|
const newWorker = createWorker();
|
|
51
|
-
this.setupWorkerHandlers(newWorker);
|
|
52
|
-
this.workers.push(newWorker);
|
|
53
|
-
this.availableWorkers.push(newWorker);
|
|
52
|
+
this.setupWorkerHandlers(newWorker.worker);
|
|
53
|
+
this.workers.push(newWorker.worker);
|
|
54
|
+
this.availableWorkers.push(newWorker.worker);
|
|
54
55
|
this.processQueue();
|
|
55
56
|
}
|
|
56
57
|
processQueue() {
|
|
@@ -58,7 +59,7 @@ export class ThreadPool {
|
|
|
58
59
|
const worker = this.availableWorkers.pop();
|
|
59
60
|
const task = this.taskQueue.dequeue();
|
|
60
61
|
this.workerTasks.set(worker, task);
|
|
61
|
-
worker.postMessage({ fn: task.fn.toString(), args: task.args });
|
|
62
|
+
worker.postMessage({ fn: task.fn.toString(), args: task.args }, task.transferables || []);
|
|
62
63
|
}
|
|
63
64
|
}
|
|
64
65
|
async execute(fn, args = []) {
|
|
@@ -66,6 +67,7 @@ export class ThreadPool {
|
|
|
66
67
|
const task = {
|
|
67
68
|
fn: fn.toString(),
|
|
68
69
|
args,
|
|
70
|
+
transferables: extractTransferables(args),
|
|
69
71
|
resolve: resolve,
|
|
70
72
|
reject
|
|
71
73
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadPool.js","sourceRoot":"","sources":["../../src/primitives/ThreadPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ThreadPool.js","sourceRoot":"","sources":["../../src/primitives/ThreadPool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractTransferables.d.ts","sourceRoot":"","sources":["../../src/utils/extractTransferables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,eAAO,MAAM,oBAAoB,GAAI,KAAK,EAAE,MAAM,KAAK,KAAG,YAAY,EAqBrE,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const extractTransferables = (args) => {
|
|
2
|
+
const transferables = [];
|
|
3
|
+
const extract = (obj) => {
|
|
4
|
+
if (!obj)
|
|
5
|
+
return;
|
|
6
|
+
if (obj instanceof ArrayBuffer) {
|
|
7
|
+
transferables.push(obj);
|
|
8
|
+
}
|
|
9
|
+
else if (ArrayBuffer.isView(obj)) {
|
|
10
|
+
if (obj.buffer instanceof ArrayBuffer) {
|
|
11
|
+
transferables.push(obj.buffer);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
else if (Array.isArray(obj)) {
|
|
15
|
+
obj.forEach(extract);
|
|
16
|
+
}
|
|
17
|
+
else if (typeof obj === 'object') {
|
|
18
|
+
Object.values(obj).forEach(extract);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
extract(args);
|
|
22
|
+
return transferables;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=extractTransferables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractTransferables.js","sourceRoot":"","sources":["../../src/utils/extractTransferables.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAQ,IAAW,EAAkB,EAAE;IACvE,MAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,MAAM,OAAO,GAAG,CAAC,GAAY,EAAQ,EAAE;QACnC,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,IAAI,GAAG,CAAC,MAAM,YAAY,WAAW,EAAE,CAAC;gBACpC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,aAAa,CAAC;AACzB,CAAC,CAAA"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
import { Worker } from "node:worker_threads";
|
|
2
|
-
export declare function createWorker():
|
|
1
|
+
import { Worker, type Transferable } from "node:worker_threads";
|
|
2
|
+
export declare function createWorker(): {
|
|
3
|
+
worker: Worker;
|
|
4
|
+
run<R, TArgs extends unknown[] = unknown[]>(fn: (...args: TArgs) => R, args?: TArgs, transferables?: Transferable[]): void;
|
|
5
|
+
};
|
|
3
6
|
//# sourceMappingURL=workerFactory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerFactory.d.ts","sourceRoot":"","sources":["../../src/utils/workerFactory.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"workerFactory.d.ts","sourceRoot":"","sources":["../../src/utils/workerFactory.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA6ChE,wBAAgB,YAAY;;QAIhB,CAAC,EAAE,KAAK,SAAS,OAAO,EAAE,kBAAkB,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,CAAC,SAAQ,KAAK,kBAA2C,YAAY,EAAE;EAIlJ"}
|
|
@@ -49,6 +49,11 @@ const workerCode = `
|
|
|
49
49
|
`;
|
|
50
50
|
export function createWorker() {
|
|
51
51
|
const worker = new Worker(workerCode, { eval: true });
|
|
52
|
-
return
|
|
52
|
+
return {
|
|
53
|
+
worker,
|
|
54
|
+
run(fn, args = [], transferables) {
|
|
55
|
+
worker.postMessage({ fn: fn.toString(), args }, transferables || []);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
53
58
|
}
|
|
54
59
|
//# sourceMappingURL=workerFactory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerFactory.js","sourceRoot":"","sources":["../../src/utils/workerFactory.ts"],"names":[],"mappings":"AAAA;;;;;EAKE;AAEF,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"workerFactory.js","sourceRoot":"","sources":["../../src/utils/workerFactory.ts"],"names":[],"mappings":"AAAA;;;;;EAKE;AAEF,OAAO,EAAE,MAAM,EAAqB,MAAM,qBAAqB,CAAC;AAEhE,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAyCV,CAAC;AAEV,MAAM,UAAU,YAAY;IACxB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,OAAO;QACH,MAAM;QACN,GAAG,CAAyC,EAAyB,EAAE,OAAc,EAAsB,EAAE,aAA8B;YACvI,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;KACJ,CAAA;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stardust-parallel-js",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Simple parallel execution library for Node.js using Worker Threads. Execute CPU-intensive tasks with thread pools and isolated workers. Supports both regular and arrow functions.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -16,11 +16,6 @@
|
|
|
16
16
|
"node": ">=14.0.0"
|
|
17
17
|
},
|
|
18
18
|
"type": "module",
|
|
19
|
-
"scripts": {
|
|
20
|
-
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
21
|
-
"test:coverage": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage",
|
|
22
|
-
"build": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json"
|
|
23
|
-
},
|
|
24
19
|
"keywords": [
|
|
25
20
|
"parallel",
|
|
26
21
|
"worker",
|
|
@@ -37,11 +32,12 @@
|
|
|
37
32
|
],
|
|
38
33
|
"author": "b1411",
|
|
39
34
|
"license": "MIT",
|
|
40
|
-
"packageManager": "pnpm@10.23.0",
|
|
41
35
|
"devDependencies": {
|
|
42
36
|
"@eslint/js": "^9.39.2",
|
|
43
37
|
"@types/jest": "^30.0.0",
|
|
44
38
|
"@types/node": "^25.0.8",
|
|
39
|
+
"coveralls": "^3.1.1",
|
|
40
|
+
"dotenv": "^17.2.3",
|
|
45
41
|
"eslint": "^9.39.2",
|
|
46
42
|
"jest": "^30.2.0",
|
|
47
43
|
"ts-jest": "^29.4.6",
|
|
@@ -52,5 +48,12 @@
|
|
|
52
48
|
},
|
|
53
49
|
"dependencies": {
|
|
54
50
|
"@datastructures-js/queue": "^4.3.0"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
54
|
+
"test:coverage": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage",
|
|
55
|
+
"build": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json",
|
|
56
|
+
"update-badge": "node scripts/update-coverage-badge.mjs",
|
|
57
|
+
"test:badge": "npm run test:coverage && npm run update-badge"
|
|
55
58
|
}
|
|
56
|
-
}
|
|
59
|
+
}
|