HTML worker对象
众所周知,javascript和java不一样,没有多线程这个概念,cpu一个时间只能做同一件事情。而我们做的只能是异步,就是尽可能的让cpu利用率大,就是当cpu需要等待一个io耗时长的事件的时候,这个事件就暂停,先让别的事件先走。 异步事件处理其实就很能理解: 在一条高速公路上,只有一条道,也就是说只能过一辆车。如果某一辆车中途需要加油,如果它直接停下来在原地加油,那么后面的车子不就过不了嘛,(估计喇叭要按爆了)就是阻塞了。如果这样,效率是不是太低,异步非阻塞的思想就是,这辆装货的车先到旁边的服务站去加油,让后面的先通行,等你加满了油,再等待交警调度(这里还需要一个调度,不是你想回就回的),决定你什么时候回到正规上来继续运行,这就是异步非阻塞。
其实worker也是这样的机制,我觉得。 worker就是上面打比方的“服务站“,然后有主线程。 一个worker对象的创建很简单
//创建一个worker对象
var worker = new Worker('worker.js');
//监听worker对象
worker.addEventListener('message', function(e) {
console.log('main')
console.log(e.data)
})
worker对象的创建
worker.js
self.addEventListener('message', function(e) {
console.log('worker')
self.postMessage('Be knows' + e.data);
})
主程序发送消息
worker.postMessage('football')
worker.postMessage('baseball')
worker对象会把自己的计算结果发给主线程(通过postMessage),由主线程去更新页面。
worker对象看不到window对象和主线程及其他worker线程中的任何对象;
worker只能看到自己的全局对象self,以及self已绑定的东西:标准的Javascript对象(如setTimeout和Math),以及浏览器的ajax方法
Node版本的worker实例
node和html的worker看起来好像差不多,都是主进程分多线程去处理。
/*Node版本worker实例*/
var cluster = require('cluster');
module.exports = function worker() {
if (cluster.isMaster) {
var coreCount = require('os').cpus().length;
for (var i = 0; i < coreCount; i++) {
cluster.fork();
}
//绑定death事件
cluster.on('death', function(worker) {
console.log('Worker' + worker.pid + 'has died');
})
} else {
process.exit();
}
}
解释一下上面的语言
var coreCount = require('os').cpus().length;
是获取操作系统的cpu内核,上面的代码是首先检测操作系统有几块内核,然后为每一片内核绑定一个进程,node的绑定是通过cluster.fork,html5是通过worker.addEventListener(),这里有一点不一样。
因为我的电脑有6核,因此就能看到这里有6个线程在运行。
因此这里我想想,我们就可以拿这个多线程做很多事情了。