JS线程机制与事件机制
JS线程机制与事件机制
1.进程与线程
(1).定义:
进程:程序的一次执行,它占有一片独有的内存空间
CPU的基本调度单位,是程序执行的一个完整的流程
(2).进程与线程的关联
一个进程一般至少有一个运行的线程:主线程
一个进程可以运行多个线程
一个进程内的数据可以供其中的多个线程共享
多个线程之间的数据是不能直接共享的
(3).浏览器基本上是多进程的
2.浏览器内核
(1).定义:支持浏览器运行的最核心的程序
(2).不同的浏览器运行的内核不同
Chrome,Safari:webkit
firefox:Gecko
IE:Trident
国内浏览器360等:Trident + webkit
(3).内核组成的模块:
html,css文档解析模块:负责页面文本的解析
dom/css模块: 负责dom/css在内存中的相关处理
布局和渲染模块:负责页面的布局和效果的绘制
定时器模块:负责定时器的管理
网络请求模块:负责服务器请求(Ajax)
事件响应模块:负责事件的管理
3.定时器
(1)分类:
循环定时器:不关闭一直执行
延时定时器:一定时间后才执行,只执行一次
(2)循环定时器:setInterval
var i = 0;
//获得定时器句柄
var intervalId = setInterval(function(){
if (i >= 5) {
//清除定时器
clearInterval(intervalId);
}
console.log(Date.now());
i++;
},1000);
(3)延时定时器:
setTimeout(function(){
console.log("----");
},2000);
4.JS是单进程的
(1)证明:
使用setTimeout()回调函数在主线程运行
定时器回调函数只有在运行栈中的代码全部执行完毕后才可能执行
(2)为什么js要使用单线程模式:
作为浏览器的脚本语言主要目的是和用户交互,以及操作DOM,单线程会避免复杂的同步问题
(3)代码分类:
初始化代码
回调代码
(4)JS引擎执行代码的基本流程
先执行初始化代码:包括一些特别的代码:
设定定时器
绑定监听
发送Ajax请求
在某一时刻执行回调代码
5.事件循环模型

执行流程:
1.同步任务加载执行
初始化代码:绑定监听,设置定时器,发送ajax请求
2.异步任务交给时间管理模块
3.管理模块监听异步任务是否满足条件,如果满足条件就会将对应的任务放入callback queue中
4.主线程同步任务执行完成后通过event loop(事件轮询机制)询问callback queue
有可执行的回调函数,就将回调函数放入主线程中执行
如果没有待会再来询问
6.Web Workers:(需要开启服务器)

(1)提供了js分线程实现
(2)相关API:
Worker:构造函数,加载分线程执行的js文件
Worker.prototype.onmessage:用于接收另一个线程的回调函数
Worker.prototype.postMessage:向另一个线程发送信息
(3)不足:
不能操作DOM(不能更新UI)
不能跨域加载JS
不是每一个浏览器都支持这个新特性
(4)代码:
在主线程html中编写
<input type="text" id="number" value="30">
<button id="btn">计算斐波那契数</button>
<script type="text/javascript"> document.getElementById("btn").onclick = function(){
var value = document.getElementById("number").value; //获得分线程
var worker = new Worker("./work.js"); //发送给分线程数据
worker.postMessage(value);
//接收分线程数据
worker.onmessage = function(event){
console.log(event.data);
} }
</script>
在同一级目录下work.js
function fibonacci(num){
return num > 2 ? fibonacci(num - 1) + fibonacci(num - 2) : 1;
}
var onmessage = function(event){
console.log("分线程监视....");
//获取主线程发送过来的数据
var data = event.data;
//分线程处理数据
data = fibonacci(data);
//返回数据给主线程
postMessage(data);
};
执行结果:
不会卡住主进程界面,大批量计算在分线程中执行。

JS线程机制与事件机制的更多相关文章
- QT源码之Qt信号槽机制与事件机制的联系
QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...
- [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播
-->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的oncl ...
- 锁机制(Lock) 信号量机制(Semaphore) 事件机制(Event)
IPC 进程间通信(inter-Process Communicate) 锁机制(Lock) l = Lock() 开启一个锁机制(实例化) 一把锁配一个钥匙 l.acquire() 获得钥匙 ...
- 剖析Qt的事件机制原理
版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMai ...
- Atitit 数据库的事件机制--触发器与定时任务attilax总结
Atitit 数据库的事件机制--触发器与定时任务attilax总结 1.1. 事件机制的图谱1 2. 触发器的类型2 3. 实现原理 After触发器 Vs Instead Of触发器2 3.1. ...
- ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)
前面的六篇文章,我们已经讨论了dapm关于动态电源管理的有关知识,包括widget的创建和初始化,widget之间的连接以及widget的上下电顺序等等.本章我们准备讨论dapm框架中的另一个机制:事 ...
- Node js 安装+回调函数+事件
/* 从网站 https://nodejs.org/zh-cn/ 下载 这里用的 9.4.0 版本 下载完安装 安装目录是 D:\ApacheServer\node 一路默认安装 安装后打开cmd命令 ...
- Node.js实战(九)之事件循环
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高. Node.js 几乎每一个 API 都是支持回调函数的. Node ...
- Node.js入门:事件机制
Evented I/O for V8 JavaScript 基于V8引擎实现的事件驱动IO. 事件机制的实现 Node.js中大部分的模块,都继承自Event模块(http://n ...
随机推荐
- 【题解】子序列个数 [51nod1202] [FZU2129]
[题解]子序列个数 [51nod1202] [FZU2129] 传送门:子序列个数 \([51nod1202]\) \([FZU2129]\) [题目描述] 对于给出长度为 \(n\) 的一个序列 \ ...
- Channel概述
前言 前两篇文章介绍了NIO核心部分部分之一的缓冲区的相关内容,接下来我们继续学习NIO中另一个重要的核心部分--Channel(通道). 在学习这篇文章之前,先做下简单的说明,本文是一篇关于通道的概 ...
- Git新建分支,分支合并,版本回退详解
一.git基本命令 git拉取仓库代码 #拉取master代码 git clone git仓库地址 #拉取分支代码 git clone -b 分支名称 git仓库地址 2.git添加代码到本地仓库 g ...
- 理解 Kubernetes 的亲和性调度
这次给大家介绍下k8s的亲和性调度:nodeSelector.nodeAffinity.podAffinity.Taints以及Tolerations用法. 一般情况下我们部署的 POD 是通过集群自 ...
- Bootstrap4 glyphicon 移除图标 glyphicon fonts-faces 解决方案
bootrap3是支持的图标 ,4不支持 4已经移除了 收费图标,取而代之建议使用其他的,比如 https://octicons.github.com/ 和http://fontawesome.io/ ...
- Java自学-接口与继承 对象转型
Java中的对象转型 示例 1 : 明确引用类型与对象类型的概念 首先,明确引用类型与对象类型的概念 在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad 对象是有类型的, 是A ...
- 换个语言学一下 Golang (13)——Web表单处理
介绍 表单是我们平常编写Web应用常用的工具,通过表单我们可以方便的让客户端和服务器进 行数据的交互.对于以前开发过Web的用户来说表单都非常熟悉.表单是一个包含表单元素的区域.表单元素是允许用户在表 ...
- SimHash算法--文章相似度匹配
SimHash原理 1.SimHash背景 SimHash算法来自于 GoogleMoses Charikar发表的一篇论文"detecting near-duplicates for we ...
- WDA演练一:用户登陆界面设计(二)
一,登陆界面设计: 1.将系统编号灰显,默认初值 2.密码栏勾选密码显示,这样就不会明文显示在页面上了: Init方法中添加默认值代码: METHOD wddoinit . DATA lo_nd_zh ...
- python基础-os模块
os 模块 功能:与操作系统交互的模块 使用方式:import os 常用的几种功能 os.path.dirname(文件名) 用于获取当前文件的所在目录 import os # 获取当前文件的所在目 ...