feat(demo, docs): introduce threading test demos for browser and fallback, enhance threading documentation
- Added `test-browser-worker.html` to demonstrate threading with Web Workers in browser environments. - Added `test-fallback.html` to verify fallback functionality when threading is unavailable. - Created `THREADING.md` to document unified threading implementation, including Node.js Worker Threads, Web Workers, and fallback mechanisms. - Updated Node.js version requirement in `README.md` and `package.json` to `>=24.0.0` for compatibility with improved Worker Threads API. - Enhanced `workerUtils.ts` to implement threading with a worker pool for Node.js and added Web Worker execution logic for browsers. - Enabled environment-aware threading availability in `environment.ts`. - Updated `rollup.config.js` to include CLI configurations for streamlined builds. - Adjusted `.gitignore` to exclude test artifacts and package files. These changes provide comprehensive testing and documentation of threading functionality, improve cross-environment compatibility, and enhance developer workflows.
This commit is contained in:
parent
1eb2993848
commit
d36711809e
10 changed files with 664 additions and 21 deletions
123
demo/test-fallback.html
Normal file
123
demo/test-fallback.html
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Brainy Fallback Test</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
}
|
||||
.result {
|
||||
margin-top: 20px;
|
||||
padding: 10px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 5px;
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
button {
|
||||
padding: 10px 15px;
|
||||
background-color: #4CAF50;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
button:hover {
|
||||
background-color: #45a049;
|
||||
}
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Brainy Fallback Test</h1>
|
||||
<p>This page tests the Brainy fallback mechanism when threading is not available.</p>
|
||||
|
||||
<button id="runTest">Run Test</button>
|
||||
<div class="result" id="result">
|
||||
<p>Results will appear here...</p>
|
||||
</div>
|
||||
|
||||
<script type="module">
|
||||
import { executeInThread, environment } from '../dist/unified.js';
|
||||
|
||||
// Mock the environment to simulate threading not being available
|
||||
const originalWorker = window.Worker;
|
||||
|
||||
document.getElementById('runTest').addEventListener('click', async () => {
|
||||
const resultDiv = document.getElementById('result');
|
||||
resultDiv.innerHTML = '<p>Running test...</p>';
|
||||
|
||||
try {
|
||||
// Log environment information
|
||||
resultDiv.innerHTML += `<p>Original Environment: ${JSON.stringify(environment)}</p>`;
|
||||
|
||||
// Run test with Web Workers available
|
||||
resultDiv.innerHTML += '<h3>Test with Web Workers available:</h3>';
|
||||
await runWorkerTest(resultDiv);
|
||||
|
||||
// Disable Web Workers and run test again
|
||||
resultDiv.innerHTML += '<h3>Test with Web Workers disabled (fallback mode):</h3>';
|
||||
window.Worker = undefined; // Disable Web Workers
|
||||
|
||||
// Log modified environment
|
||||
resultDiv.innerHTML += `<p>Modified Environment (Worker disabled): ${typeof window.Worker}</p>`;
|
||||
|
||||
await runWorkerTest(resultDiv);
|
||||
|
||||
// Restore Web Workers
|
||||
window.Worker = originalWorker;
|
||||
resultDiv.innerHTML += '<p>Test completed. Web Workers restored.</p>';
|
||||
|
||||
} catch (error) {
|
||||
resultDiv.innerHTML += `<p>Error: ${error.message}</p>`;
|
||||
console.error('Error during test:', error);
|
||||
// Ensure Worker is restored even if there's an error
|
||||
window.Worker = originalWorker;
|
||||
}
|
||||
});
|
||||
|
||||
async function runWorkerTest(resultDiv) {
|
||||
// Define a compute-intensive function
|
||||
const computeIntensiveFunction = `
|
||||
function(data) {
|
||||
console.log('Worker/Fallback: Starting computation...');
|
||||
|
||||
// Simulate a compute-intensive task
|
||||
const start = Date.now();
|
||||
let result = 0;
|
||||
for (let i = 0; i < data.iterations; i++) {
|
||||
result += Math.sqrt(i) * Math.sin(i);
|
||||
}
|
||||
|
||||
const duration = Date.now() - start;
|
||||
console.log('Worker/Fallback: Computation completed in ' + duration + 'ms');
|
||||
|
||||
return {
|
||||
result,
|
||||
duration,
|
||||
iterations: data.iterations,
|
||||
webWorkersAvailable: typeof window.Worker !== 'undefined'
|
||||
};
|
||||
}
|
||||
`;
|
||||
|
||||
// Execute the function
|
||||
resultDiv.innerHTML += '<p>Starting execution...</p>';
|
||||
const startTime = Date.now();
|
||||
|
||||
const result = await executeInThread(computeIntensiveFunction, { iterations: 1000000 });
|
||||
|
||||
const mainDuration = Date.now() - startTime;
|
||||
resultDiv.innerHTML += `<p>Execution completed in ${mainDuration}ms</p>`;
|
||||
resultDiv.innerHTML += `<pre>${JSON.stringify(result, null, 2)}</pre>`;
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Add table
Add a link
Reference in a new issue