dphelper
Version:
dphelper devtools for developers
224 lines (174 loc) • 6.04 kB
Markdown
# worker
Web Worker management utilities for multi-threaded JavaScript execution, including worker creation, pool management, and parallel task processing.
## Functions
| Function | Description | Example |
|----------|-------------|---------|
| `create` | Create a worker from URL | `dphelper.worker.create('worker.js', { onmessage: (e) => console.log(e.data) })` |
| `createInline` | Create worker from inline code | `dphelper.worker.createInline('self.onmessage = e => postMessage(e.data * 2)')` |
| `post` | Send message to worker | `dphelper.worker.post(worker, { type: 'compute', data: 42 })` |
| `terminate` | Stop a worker | `dphelper.worker.terminate(worker)` |
| `pool` | Create worker pool | `dphelper.worker.pool('worker.js', 4)` |
| `poolExec` | Execute tasks in pool | `dphelper.worker.poolExec(pool, tasks)` |
| `importScripts` | Import scripts into worker | `dphelper.worker.importScripts(worker, ['lib1.js', 'lib2.js'])` |
| `shared` | Create SharedWorker | `dphelper.worker.shared('my-worker.js', { name: 'shared' })` |
## Description
Powerful Web Worker management module providing:
- **Inline Workers** - Create workers from JavaScript strings without external files
- **Worker Pools** - Manage multiple workers for parallel processing
- **SharedWorkers** - Cross-tab communication via shared worker
- **Script Import** - Dynamically import external scripts into workers
- **Transferable Support** - Efficient data transfer using Transferable objects
## Usage Examples
### Basic Worker Creation
```javascript
// Create worker from external file
const worker = dphelper.worker.create('worker.js', {
onmessage: (e) => {
console.log('Received:', e.data);
},
onerror: (e) => {
console.error('Worker error:', e);
}
});
// Send message to worker
dphelper.worker.post(worker, { type: 'hello', data: 'world' });
// When done, terminate worker
dphelper.worker.terminate(worker);
```
### Inline Workers
```javascript
// Create worker from inline code
const worker = dphelper.worker.createInline(`
self.onmessage = function(e) {
// Perform heavy computation
const result = e.data * 2;
postMessage(result);
};
`, {
onmessage: (e) => {
console.log('Result:', e.data); // 84
}
});
dphelper.worker.post(worker, 42);
```
### Worker Pool for Parallel Processing
```javascript
// Create a pool of 4 workers
const pool = dphelper.worker.pool('compute-worker.js', 4);
// Prepare tasks
const tasks = [
{ id: 1, data: 100 },
{ id: 2, data: 200 },
{ id: 3, data: 300 },
{ id: 4, data: 400 },
{ id: 5, data: 500 }
];
// Execute all tasks in parallel across the pool
const results = await dphelper.worker.poolExec(pool, tasks);
console.log(results); // [200, 400, 600, 800, 1000]
```
### SharedWorker for Cross-Tab Communication
```javascript
// Create shared worker (accessible from multiple tabs)
const shared = dphelper.worker.shared('shared-worker.js', {
name: 'my-shared-worker',
onconnect: (e) => {
console.log('New connection:', e.ports[0]);
},
onmessage: (e) => {
console.log('Shared message:', e.data);
}
});
// Send message through port
shared.port.postMessage({ type: 'hello' });
shared.port.start();
```
### Importing Scripts
```javascript
const worker = dphelper.worker.create('main-worker.js');
// Import external libraries into worker
dphelper.worker.importScripts(worker, [
'https://cdn.example.com/lib1.js',
'https://cdn.example.com/lib2.js'
]);
```
## Advanced Usage
### Parallel Data Processing
```javascript
// Worker file: data-processor.js
/*
self.onmessage = function(e) {
const { id, numbers } = e.data;
// Heavy computation
const sum = numbers.reduce((a, b) => a + b, 0);
const avg = sum / numbers.length;
postMessage({ id, sum, avg });
};
*/
async function processData(items) {
const pool = dphelper.worker.pool('data-processor.js', navigator.hardwareConcurrency || 4);
const tasks = items.map((item, index) => ({
index,
data: { id: item.id, numbers: item.values }
}));
const results = await dphelper.worker.poolExec(pool, tasks);
// Sort by original index
return results.sort((a, b) => a.id - b.id);
}
// Usage
const data = [
{ id: 1, values: [1, 2, 3, 4, 5] },
{ id: 2, values: [10, 20, 30] },
{ id: 3, values: [100, 200] }
];
const processed = await processData(data);
console.log(processed);
```
### Real-time Communication with Pool
```javascript
class WorkerPoolManager {
constructor(workerScript, poolSize = 4) {
this.pool = dphelper.worker.pool(workerScript, poolSize);
this.results = new Map();
}
async processTask(taskId, data) {
return new Promise((resolve, reject) => {
const handler = (e) => {
if (e.data.taskId === taskId) {
this.results.delete(taskId);
resolve(e.data.result);
}
};
this.pool.workers.forEach(w => w.addEventListener('message', handler));
dphelper.worker.post(this.pool.workers[0], { taskId, data });
});
}
terminate() {
this.pool.workers.forEach(w => dphelper.worker.terminate(w));
}
}
```
### Web Worker with Transferables
```javascript
// Efficiently transfer large data without copying
const buffer = new ArrayBuffer(1024 * 1024); // 1MB
const numbers = new Uint8Array(buffer);
// Fill with data...
const worker = dphelper.worker.createInline(`
self.onmessage = function(e) {
const data = new Uint8Array(e.data.buffer);
// Process data...
postMessage({ processed: true }, [e.data.buffer]);
};
`);
// Transfer the buffer ownership to worker
dphelper.worker.post(worker, numbers, [buffer]);
```
## Details
- **Author:** Dario Passariello
- **Version:** 0.0.1
- **Creation Date:** 20260313
- **Last Modified:** 20260313
- **Environment:** Client-side only (browser)
---
*Automatically generated document*