您当前的位置: 首页 >  html5

插件开发

暂无认证

  • 1浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

js-线程机制-html5-多线程支持-Web Worker

插件开发 发布时间:2022-06-05 09:16:30 ,浏览量:1

文章目录
    • 1.真正的多线程JS
    • 2.创建 web worker 文件
    • 3.创建 Web Worker 对象
    • 4.终止 Web Worker
    • 5.完整文件
    • 6.Web Workers 和 DOM
  什么是多线程?多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。

  浏览器中有三个常驻的线程,分别是JS引擎,界面渲染,事件响应。由于这三个线程同时要访问DOM树,所以为了线程安全,浏览器内部需要做互斥:当JS引擎在执行代码的时候,界面渲染和事件响应两个线程是被暂停的。所以当JS出现死循环,浏览器无法响应点击,也无法更新界面。现在的浏览器的JS引擎都是单线程的,尽管多线程功能强大,但是线程同步比较复杂,并且危险,稍有不慎就会崩溃死锁。单线程的好处不必考虑线程同步这样的复杂问题,简单而安全。   1.setTimeout,setInterval并不是多线程,只是一个定时的事件触发器,它们在合适的时间把一些JS代码塞到JS引擎的队列中。   2.setTimeout(aFunction, 0),这行代码看似的意思是在0秒之后执行aFunction, 但这并不意味着立即执行。其它真正的意思是立刻把aFunction的代码放到当前JS引擎的队列中。所以当前代码块执行完成之前,aFunction的代码是得不到执行的。比如这段代码,一定是world先出来,hello后出来。尽管setTimeout的参数是0,但这并不意味着立即执行。   3.在一个事件的响应代码执行完成之后,即使队列中有待执行的代码,浏览器也会先执行页面渲染和响应事件,完成之后再执行队列中的代码。

  异步Ajax:它确实用了多线程,只是Ajax请求的Http连接部分由浏览器另外开了一个线程执行,执行完毕之后给JS引擎发送一个事件,这时候异步请求的回调代码得以执行。Http请求的执行在另外一个线程中,由于这个线程并不会操作DOM树,所以是可以保证线程安全的。发起Ajax请求和回调函数中间是没有JS执行的,所以页面不会卡死。

1.真正的多线程JS

  web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行。所有主流浏览器均支持 web worker,除了 Internet Explorer。   在创建 web worker 之前,请检测用户的浏览器是否支持它:

if(typeof(Worker)!=="undefined"){
  // Yes! Web worker support!
  // Some code.....
}
else{
  // Sorry! No Web Worker support..
}
2.创建 web worker 文件

  现在,让我们在一个外部 JavaScript 中创建我们的 web worker。在这里,我们创建了计数脚本。该脚本存储于 “demo_workers.js” 文件中:

var i = 0;
function timedCount() {
    i = i + 1;
    postMessage(i);
    setTimeout("timedCount()", 500);
}
timedCount();

  以上代码中重要的部分是 postMessage() 方法 - 它用于向 HTML 页面传回一段消息。   注释:web worker 通常不用于如此简单的脚本,而是用于更耗费 CPU 资源的任务。

3.创建 Web Worker 对象

  我们已经有了 web worker 文件,现在我们需要从 HTML 页面调用它。下面的代码检测是否存在 worker,如果不存在,- 它会创建一个新的 web worker 对象,然后运行 “demo_workers.js” 中的代码:

if (typeof(w) == "undefined") {
    w = new Worker("demo_workers.js");
}

  然后我们就可以从 web worker 发生和接收消息了。向 web worker 添加一个 “onmessage” 事件监听器:

w.onmessage = function (event) {
    document.getElementById("result").innerHTML = event.data;
};

  当 web worker 传递消息时,会执行事件监听器中的代码。event.data 中存有来自 event.data 的数据。

4.终止 Web Worker

  当我们创建 web worker 对象后,它会继续监听消息(即使在外部脚本完成之后)直到其被终止为止。如需终止 web worker,并释放浏览器/计算机资源,请使用 terminate() 方法:

w.terminate();
5.完整文件


	
		Count numbers: 
		
		Start Worker
		Stop Worker
		
		
		
			var w;

			function startWorker() {
				if (typeof(Worker) !== "undefined") {
					if (typeof(w) == "undefined") {
						w = new Worker("demo_workers.js");
					}
					w.onmessage = function (event) {
						document.getElementById("result").innerHTML = event.data;
					};
				} else {
					document.getElementById("result").innerHTML = "Sorry, your browser
						does not support Web Workers...";
				}
			}

			function stopWorker() {
				w.terminate();
			}
		
	

6.Web Workers 和 DOM

  由于 web worker 位于外部文件中,它们无法访问下例 JavaScript 对象:   window 对象   document 对象   parent 对象

  合理的脚本代码可以有效的提高工作效率,减少重复劳动。

关注
打赏
1665481431
查看更多评论
立即登录/注册

微信扫码登录

0.0404s