【nodejs学习】3.进程管理及异步编程
进程管理
1.调用终端命令实现目录目录拷贝
var child_procress = require('child_procress');
var util = require('util');function copy(source, target, callback){
child_procress.exec(util.format('cp -r %s/* %s', source, target), callback);
}copy('a', 'b', function(err){
// ...
});
2.Process
3.Child Procress
4.Cluster
进程管理有好多东西,但是却不是能写清楚的,具体需要什么怎样运行,其实都是具体情况具体分析,需要的时候查询官方API是个不错的办法。
异步编程
事件机制和异步IO是nodejs的特点。如果不会异步编程,那岂不是说nodejs没什么意思了吗!
1.回调
function heavyCompute(n, callback){
var count = 0, i, j;
for(i = n; i > 0; --i){
for(j = n; j > 0; --j){
count += 1;
}
}
callback(count);
}heavyCompute(10000, function(count){
console.log(count);
});console.log('hello');
//100000000
//hello
上面的程序是单线程的。
setTimeout(function(){
console.log('world');
}, 1000);console.log('hello');
//hello
//world
setTimeout在JS规范外,由运行环境提供的特殊函数创建一个平行进程后立即返回继续执行后续代码,平行线程执行完成后通知回来继续执行回调函数。setinterval,fs.readFile都是这样异步的。
平行线程执行完成工作,通知主线程,主线程如果在忙,则不会立刻执行,而是要等到主线程空闲时才会执行相关操作。
2.代码设计模式
1)函数返回值
//同步
var output = fn1(fn2('input'));
//异步方式
fn2('input', function(output2){
fn1(output2, function(output1){
});
});
2)遍历数组
//同步
var len = arr.length, 1=0;
for(;i<len;i++){
arr[i]=sync(arr[i]);
}
//异步
(function next(i, len, callback){
if(i<len){
async(arr[i], function(value){
arr[i]=value;
next(i+1,len,callback);
});
}else{
callback();
}
}(0, arr.length, function(){
}));
//如果数据数组数据可以并行处理,但是后续代码需要数据数组数据全部处理好的情况下
(function(i, len, count, callback){
for(;i<len;++i){
(function(i){
async(arr[i], function(value){
arr[i]=value;
if(++count===len){
callback();
}
});
});
}
}(0, arr.length, 0, function(){
//init finish
}));
3)异常处理
try-catch
function sync(fn){
return fn();
}try{
sync(null);
}catch(err){
console.log('err::', err.message);
}
//=>object is not a function
4)域
如果按照上面的方法写,如果是函数多层调用,那代码就太丑了,在上面贴了一个那样的例子,系统提示,代码太丑无法显示,哎,算了,去掉吧,哈哈。因此NodeJS提供domain简化异常处理。用process捕获全局异常。
process.on('uncaughtException', function(err){
console.log('ERR::', err.message);
});
setTimeout(function(fn){
fn();
});
function async(request, callback){
//Do something
asyncA(request, function(data){
//Do something
asyncB(request, function(data){
//Do something
asyncC(request, function(data)){
// Do something
callback(data);
}
});
});
}http.createServer(function(request, response){
var d = domain.create();
d.on('error', function(){
response.writeHead(500);
response.end();
});
d.run(function(){
async(request, function(data){
response.writeHead(200);
response.end(data);
});
});
});
【nodejs学习】3.进程管理及异步编程的更多相关文章
- Linux学习之进程管理(十九)
Linux学习之进程管理 进程查看 查看系统中所有进程,使用BSD操作系统的格式 语法:ps aux 选项: a:显示所有前台进程 x:显示所有后台进程 u:显示这个进程是由哪个用户产生的 语法:ps ...
- Linux学习之进程管理
|-进程管理 进程常用命令 |- w查看当前系统信息 |- ps进程查看命令 |- kill终止进程 |- 一个存放内存中的特殊目录/p ...
- Linux零起点之进程管理----c语言编程
进程 (Process)是指操作系统中被加载到内存中的.正在运行的应用程序实例.进程是系统资源分配的基本单元,在其生命周期内会使用系统中的各种资源.进程主要由程序.数据以及进程控制快(PCB)3个部分 ...
- Linux系统学习之进程管理
什么是进程? 进程表示程序的一次执行过程,它是应用程序的运行实例,是一个动态的过程.或者可以更简单地描述为:进程是操作系统当前运行的程序.当一个进程开始运行时,就要启动了这个过程.进程包括动态的执行的 ...
- perl学习之进程管理
系统函数 == 最简单的系统调用 system "date"; # Perl会将 date 命令传递给unix的shell并获取返回值和error信息等 == 带有系统参数的 ...
- linux内核学习之进程管理------task_struct结构体
struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ struct t ...
- nodejs学习以及SSJS漏洞
0x01 简介 什么是nodejs,it's javascript webserver! JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对 ...
- nodejs 异步编程 教程(推荐)
有异步I/O就需要异步编程.本课程将着重讲解在学习node.js中关于异步编程的一些问题,以及如何应对这些问题,帮助node.js初学者快速入门. 地址 http://www.hubwiz.com/c ...
- 深入理解 Python 异步编程(上)
http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...
随机推荐
- 解决easyui datagrid加载数据时,checkbox列没有根据checkbox的值来确定是否选中
背景: 昨天帮朋友做一个easyui datagrid的小实例时,才发现easyui datagrid的checkbox列,没有根据值为true或false来选中checkbox,当时感觉太让人失 ...
- SQL Server 触发器(转)
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...
- html5 利用canvas实现简单的人物走动
最近在学习html5,其中涉及到很关键的元素canvas-画布,在网上下载了一些游戏源代码,虽然能看懂,但是想单独地针对某个功能提取出来还是有难处的,于是乎自己又上网查找了一些例子,才将超级玛丽简单的 ...
- JavaScript不一样的语法
JavaScript除了面向对象的部分,基本语法和C语言类似,但是也有一些自己的特别之处,现总结如下: (1)break和continue后面可以跟label 语法: break labelname; ...
- 自己寫的 Loading JS插件
本文為原創文章,轉載請注明出處,謝謝./** * @author samkin.yang * @version 1.0 */var $_yxj = new SamkinLoading(); (func ...
- Memcached使用手册
memcached简介 1.memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果 ...
- Android 读取和保存文件(手机内置存储器)
1:activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/androi ...
- C 語言中的編譯指示 (Pragma)
編譯指示 #pragma 是用來告知編譯器某些特殊指示,例如不要輸出錯誤訊息,抑制警告訊息,或者加上記憶體漏洞檢查機制等.這些指示通常不是標準的 C 語言所具備的,而是各家編譯器廠商或開發者所制定的, ...
- GitHub 如何基於 Node.js 和 Chromium 開發 Atom?
看到回答里, 多数都没有回答到点子上, 还有些给了非常主观的意见而没有给出实际结论和分析过程. 题主的问题有四个: 1. Github 如何基于 Node.js 和 Chromium 开发 Atom? ...
- win7下自写驱动导致开机蓝屏调试过程
之前没有接触过驱动调试.这里上手就要解决一个因为某个自定义驱动导致的系统登陆后蓝屏问题,记录下来. 问题: 从客户那边弄来的一个虚拟机,已知是加了我们的驱动之后才会导致蓝屏. 解决过程: 使用 ...