Alex Saskevich, @asaskevich
for (var i = 0; i < 10e10; i ++) {
doSomeAwesomeWork();
}
var doSomeWork = function() {
doSomeHardCalculations();
}
function someThread(id) {
setInterval(function() {
console.log('Hi from thread #id =', id);
}, 20);
}
someThread(1);
someThread(2);
someThread(3);
someThread(4);
someThread(5);
var doCalculations = function(n) {
setTimeout(function() {
var i = 0;
var res = 0;
while (i < n) {
res += i;
i++;
}
}, 0);
}
var worker = new Worker('worker.js');
//..
var worker = new Worker('scripts/worker.js');
worker.postMessage('hi');
worker.addEventListener('message', function(e) {
console.log('Worker said: ', e.data);
}, false);
// Передавать можно либо строки,
worker.postMessage('Hello World');
// либо JSON объекты
worker.postMessage({msg: 'say hello'});
self.addEventListener('message', function(e) {
self.postMessage(e.data);
}, false);
// Основной скрипт
worker.terminate();
...
// worker.js
self.close();
// worker.js
// Ничего не загрузит
importScripts();
// Загрузит script.js
importScripts('script.js');
// Загрузит foo.js и bar.js
importScripts('foo.js', 'bar.js');
// Создаем на основе BlobBuilder
// экземпляр встроенного воркера
var code = 'onmessage = function(e) { ... }';
var blob = new BlobBuilder();
blob.append(code);
blob = blob.getBlob();
// Создаем на основе Blob
// экземпляр встроенного воркера
var code = 'onmessage = function(e) { ... }';
var blob = new Blob([code],
{type: 'application/javascript'});
var blobURL = URL.createObjectURL(blob);
var worker = new Worker(blobURL);
// blobURL имеет примерно такой вид
// a923da41-3ce9-4d1a-f145-eacs532539b1
URL.revokeObjectURL(blobURL);
<script id="worker" type="javascript/worker">
// Код воркера
// ...
</script>
// ...
var code = document.querySelector('#worker').textContent;
var blob = new Blob([code],
{type: 'application/javascript'});
function errorHandler(e) {
// e.lineno - номер строки
// e.filename - имя файла
// e.message - сообщение об ошибке
// ...
}
worker.addEventListener('error', errorHandler, false);
--allow-file-access-from-files
var worker = new SharedWorker("script.js");
worker.port.addEventListener('message',
function(e) { .. }, false);
worker.port.start();
worker.port.postMessage('hi');
var ports = [];
onconnect = function(event) {
var port = event.ports[0];
ports.push(port);
port.start();
port.addEventListener("message",
function(e) { handler(e, port); } );
}
handler = function(e, port) {
port.postMessage('hello');
}
Simulated Web Workers
<script src="path/to/multithread.js"></script>
var threadCount = 4;
var MT = new Multithread(threadCount);
MT.process(function(a, b, c) {
// некоторые вычисления
return result;
}, function callback(result) {
// обработка результата
})(a, b, c);
function scopeCheck() {
var scopeVar = 2;
MT.process(
// scopeVar is not defined
function() { return scopeVar + 2; },
function(r) { console.log('Hop-hey'); }
)();
}
scopeCheck();
<script src="parallel.js"></script>
$ npm install paralleljs
var p = new Parallel(someData);
var slowSquare = function (n) {
var i = 0;
while (++i < n * n) {}
return i;
};
var p = new Parallel(100000);
p.spawn(slowSquare).then(function() {
alert('Completed!');
});
var p = new Parallel([0, 1, 2, 3, 4, 5, 6]),
log = function () { console.log(arguments); };
function fib(n) {
return n < 2 ? 1 : fib(n - 1) + fib(n - 2);
};
p.map(fib).then(log)
var p = new Parallel(_.range(50));
function add(d) { return d[0] + d[1]; }
function log() { console.log(arguments); }
p.map(function (n) {
return Math.pow(10, n);
}).reduce(add).then(log);