异步式I/O与实践式编程
阻塞
线程在执行中如果遇到磁盘读写或网络通信(统称为I/O操作)通常要消耗很长时间 这时操作系统会剥夺这个线程的CPU控制权,使其暂停执行,同时将资源让给其他工作线程 异步I/O 非阻塞IO
针对所有的IO操作不采用阻塞的策略,当线程遇到IO操作时,不会以阻塞的方式等待IO操作完成或数据的返回,而只是将IO请求发送给操作系统,继续执行下一条语句。当操作系统完成IO操作时,以事件的形式通知执行IO操作的线程,线程会在特定时候处理这个事件。
为了处理异步IO 线程必须有事件循环 不断地检查有咩有未处理的事件 依次处理 单线程事件驱动的异步式I/O比较传统的多线程阻塞式I/O优势?
异步式I/O就是少了多线程的开销 对于操作系统来说,创建线程的代价十分昂贵
需要分配内存 列入调度 同时在线程切换时还要执行内存换页 CPU的缓存被清空
切换回来还要从中心从内存中读信息 破坏了数据的局部性 同步式I/O(阻塞式) 异步I/O(非阻塞式)
利用多线程提供吞吐量 单线程即可实现高吞吐量
通过事件片段分割和线程调度利用多核CPU 通过功能的划分利用多核CPU
需要由操作系统调度多线程受用多核CPU 可以将单进程绑定到单核CPU
难以充分利用CPU资源 可以充分利用CPU资源
内存轨迹大 数据局部性弱 内存轨迹小 数据局部性强
符合线性的编程思维 不符合传统编程思维 fs.readFile("fileName", "编码",回调函数) //fileName不能是中文
var data = fs.readFileSync("fileName", "编码")
以上两种分别为异步读文件 和 同步读文件 Node.js的事件循环机制(有疑问 具体流程还是不了解)
Node.js在什么时候会进入事件循环呢?
Node.js程序由事件循环开始,到事件循环结束,所有的逻辑都是事件的回调函数,所以Node.js一直处在事件循环中,程序入口就是事件循环第一个事件的回调函数。事件的回调函数在执行的过程中,可能会发出I/O请求或直接发射(emit)事件,执行完毕后再返回事件循环,事件循环会检查事件队列中未处理的事件,直到程序结束 模块
创建模块
一个文件就是一个模块 问题点如何在其他文件中获取这个模块
node exports 和 require两个对象
exports 模块公开的接口
require 用于从外部获取一个模块的接口 即所获取模块的exports对象 require加载模块 只加载一次 都是同一个实例 类似于 单例模式 警告:
不可以通过对exports直接赋值代替对module.exports赋值
exports实际上只是一个和module.exports指向同一个对象的变量
exports本身会在模块执行结束后释放
但是module不会,因此只能通过指定的module.exports来访问接口
exports = Hello; 报错 Hello 不是一个函数
写成 modules.exports = Hello;-->var Hello = require("./Hello")
exports.hello = Hello; ---> var Hello = require("./Hello").Hello; 创建包
创建包 需要符合CommonJS规范 CommonJS规范如下
package.json 必须在包的顶层目录下;
二进制文件应该在 bin 目录下;
JavaScript 代码应该在 lib 目录下;
文档应该在 doc 目录下;
单元测试应该在 test 目录下。 node getpackage.js 控制台打印出Hello Node.js在调用某个包时,会首先检查包中package.json文件的main字段,将其作为包的接口模块
未配置package.json 时 会尝试寻找index.js或index.node为入口文件 我们使用这种方法可以把文件夹封装为一个模块,即所谓的包。包通常是一些模块的集合,在模块的基础上提供了更高层的抽象,
相当于提供了一些固定接口的函数库 通过定制package.json 我们可以创建更复杂的 规范 完善的包用语发布 package.json是用来描述CommonJS规范的,完全符合package.json文件应该含有一下字段
name 包的名称 必须是唯一的 由小写英文字母 数字 下划线组成 不能包含空格
description 包的简要说明
version 符合语义化版本识别规范的版本字符串
keywords 关键字数组 通常用于搜索
maintainers 维护者数组 每个元素包含 name email(可选) web(可选)
contributors 贡献者数组 格式同上 包的作者应该是贡献者数组的第一个元素
bugs 提交bug的地址 可以是网址或者电邮
licenses 许可证数组 每个元素要包含type(许可证的名称)和url(链接到许可证文本的地址)字段
repositories 仓库托管地址数组 每个元素要包含type(仓库的类型 如git) url(仓库地址) path(相对于仓库的路径 可选) 字段
dependencies 包的依赖 一个关联数组 由包的名称和版本号组成 example
{
"name": "mypackage",
"description": "Sample package for CommonJS. This package demonstrates the required
elements of a CommonJS package.",
"version": "0.7.0",
"keywords": [
"package",
"example"
],
"maintainers": [
{
"name": "Bill Smith",
"email": "bills@example.com",
}
],
"contributors": [
{
"name": "BYVoid",
"web": "http://www.byvoid.com/"
}
],
"bugs": {
"mail": "dev@example.com",
"web": "http://www.example.com/bugs"
},
"licenses": [
{
"type": "GPLv2",
"url": "http://www.example.org/licenses/gpl.html"
}
],
"repositories": [
{
"type": "git",
"url": "http://github.com/BYVoid/mypackage.git"
}
],
"dependencies": {
"webkit": "1.2",
"ssl": {
"gnutls": ["1.0", "2.0"],
"openssl": "0.9.8"
}
}
} Node.js的require在加载模块时会尝试搜索 node_modules 子目录 因此使用npm本地安装的包可以直接引用 使用npm全局安装的包(example supervisor) 主要是为了在环境变量中注册supervisor 可以在命令行中使用
npm本地安装仅仅 把包安装到node_modules子目录下 其中的bin目录没有包含在PATH环境变量中 不能直接在命令中调用
使用全局模式安装 npm会将包安装到系统目录 譬如 /usr/local/lib/node_modules 同时package.json文件中的bin字段包含的文件会被链接到/usr/local/bin /usr/local/bin是在PATH环境变量中默认定义的 因此可以直接在命令行中使用 提示:使用全局安装的包并不能直接在js文件中用require获得 因为require不会搜索/usr/local/node_modules/ npm link npm link express 可以在node_modules子目录中发现一个指向安装全局包的符号链接 通过这种方法可以使全局包当本地宝使用(不支持window) npm link 可以将本地的包链接到全局
使用方法:在包目录(package.json所在目录)中运行npm link 命令 发布包
发布之前需要获得一个账号用于维护自己的包 使用npm adduser 根据提示输入用户名 密码 邮箱
npm whoami 检测帐号是否存在
在package.json所在目录使用npm publish 发布
npm unpublish取消发布
如果包有更新 package.json文件中修改version即可 ?????????????疑惑?????????????
1: exports本身会在模块执行结束后释放( 被释放exports.Hello = Hello怎么还会被访问到呢???? )
解答
Node不允许重写exports exports = Hello; 如果创建的返回 既有exports.hello 又有 module.exports = 则以module为准 上面的问题可以理解为 导出的究竟是什么
最终程序导出的事module.exports; exports只是对module.exports的一个全局引用 最初被定义为一个可以添加属性的空对象 所以exports.Hello 只是module.exports.Hello 的简写
如果把exports定义成别的 就打破了module.exports 和 exports之间的引用关系 感觉像是A关联B B关联A 最后倒出A 但是B指向了C 与A断开了联系 导出A的时候A找不到B 所以报错
2: 语义化版本识别
3: Node.js调试 还未接触
异步式I/O与实践式编程的更多相关文章
- NodeJS示例异步式(Asynchronous)IO与同步式Synchronous)IO
理解IO IO(Input/Output)通常是指计算机线程进行慈磁盘读写或者网络通信时的一种行为. 同步式(Synchronous)IO和异步式(Asynchronous )IO ...
- html响应式布局,css响应式布局,响应式布局入门
html响应式布局,css响应式布局,响应式布局入门 >>>>>>>>>>>>>>>>>>& ...
- CSS的三种样式:内联式,嵌入式,外部式以及他们的优先级
从CSS 样式代码插入的形式来看基本能够分为下面3种:内联式.嵌入式和外部式三种. 1:内联式css样式表就是把css代码直接写在现有的HTML标签中,如以下代码: <p style=" ...
- [Selenium]显式等待 Explicit wait & 隐式等待 Implicit wait
显式等待 Explicit wait 显示等待 , 就是明确的要等到某个元素出现或者某个元素满足某种条件,每隔一段时间检查一次,等不到,就一直等,如果在规定的时间内还没有找到,就跳出来检查间隔的时间和 ...
- python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解
推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...
- RTX——第10章 任务调度-抢占式、时间片和合作式
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章教程为大家将介绍 RTX 操作系统支持的任务调度方式,抢占式,时间片和合作式,这部分算是RTX 操作 ...
- FreeRTOS——任务调度—抢占式,时间片和合作式
以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章教程为大家将介绍 FreeRTOS 操作系统支持的任务调度方式:抢占式,时间片和合作式,这部分算是 Fr ...
- 20121124.Nodejs异步式I/O与事件式编程
异步: 你请人吃饭,准备一起去的.结果那人刚好有事,让你先去点菜,你去点好菜,他忙完就来了,这就是异步的优势(不耽误事!)同步: 就是,你必须等那个人忙完了,才一起去(浪费时间) 理解来源于群友&qu ...
- 通过实例让你真正明白mapreduce---填空式、分布(分割)编程
本文链接:http://www.aboutyun.com/thread-8303-1-1.html 问题导读: 1.如何在讲mapreduce函数中的字符串等信息,输出到eclipse控制台?2.除了 ...
随机推荐
- ArcGis连接oracle失败:ORA-6413:连接未打开
问题: 通过ARCMap 添加Oracle数据库连接时提示,ORA-6413:连接未打开. 运行环境: ArcGis 10.2 Oracle 10g 解决方法: 通过上网查找解决方法,网友说" ...
- FFmpeg AVPacket
AVPacket注解 AVPacket 是一个结构体,存储压缩数据.可作为编码器的输出,解码器的输入. 对于 Video 一般包含一个压缩帧,对于 Audio 可能包含多个压缩帧. 编码器允许输出空 ...
- 【扩展欧几里得】NOIP2012同余方程
题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...
- HTML知识点总结之ul,ol,li标签
HTML列表分为有序列表,无序列表和描述列表.我们常用的是有序列表(ol)与无序列表(ul). 有序列表 <ol>标签就可以定义一个有序列表,之所以称其为有序列表,是因为可以使列表具有排序 ...
- 运用OpenMP提速图像处理速度
一.算法测试 // openmptest的测试程序#include "stdafx.h"void Test(int n){ for (int i=0;i<10000;i ...
- Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现.如 ...
- css的学习笔记
CSS3有哪些新特性? 1. CSS3实现圆角(border-radius),阴影(box-shadow), 2. 对文字加特效(text-shadow.),线性渐变(gradient),旋转(tra ...
- cs231n spring 2017 lecture4 Introduction to Neural Networks 听课笔记
1. Backpropagation:沿着computational graph利用链式法则求导.每个神经元有两个输入x.y,一个输出z,好多层这种神经元连接起来,这时候已知∂L/∂z,可以求出∂L/ ...
- x64_dbg破解64位WinSnap4.5.6图文视频教程
一.软件简单介绍: WinSnap是一个轻巧.快速.简单.友好的截图工具,提供屏幕截图和图像编辑功能.和其它截图软件相比其最大亮点在于WinSnap可以捕获或去除Win7的 Aero玻璃效果.WinS ...
- Vijos P1785 同学排序【模拟】
同学排序 描述 现有m位同学,第1位同学为1号,第2位同学为2号,依次第m位同学为m号.要求双号的学生站出来,然后余下的重新组合,组合完后,再次让双号的学生站出来,重复n次,问这时有多少同学出来站着? ...