进程管理

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.进程管理及异步编程的更多相关文章

  1. Linux学习之进程管理(十九)

    Linux学习之进程管理 进程查看 查看系统中所有进程,使用BSD操作系统的格式 语法:ps aux 选项: a:显示所有前台进程 x:显示所有后台进程 u:显示这个进程是由哪个用户产生的 语法:ps ...

  2. Linux学习之进程管理

    |-进程管理     进程常用命令        |- w查看当前系统信息        |- ps进程查看命令        |- kill终止进程        |- 一个存放内存中的特殊目录/p ...

  3. Linux零起点之进程管理----c语言编程

    进程 (Process)是指操作系统中被加载到内存中的.正在运行的应用程序实例.进程是系统资源分配的基本单元,在其生命周期内会使用系统中的各种资源.进程主要由程序.数据以及进程控制快(PCB)3个部分 ...

  4. Linux系统学习之进程管理

    什么是进程? 进程表示程序的一次执行过程,它是应用程序的运行实例,是一个动态的过程.或者可以更简单地描述为:进程是操作系统当前运行的程序.当一个进程开始运行时,就要启动了这个过程.进程包括动态的执行的 ...

  5. perl学习之进程管理

    系统函数 == 最简单的系统调用  system "date"; # Perl会将 date 命令传递给unix的shell并获取返回值和error信息等   == 带有系统参数的 ...

  6. linux内核学习之进程管理------task_struct结构体

    struct task_struct { volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */ struct t ...

  7. nodejs学习以及SSJS漏洞

    0x01 简介 什么是nodejs,it's javascript webserver! JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对 ...

  8. nodejs 异步编程 教程(推荐)

    有异步I/O就需要异步编程.本课程将着重讲解在学习node.js中关于异步编程的一些问题,以及如何应对这些问题,帮助node.js初学者快速入门. 地址 http://www.hubwiz.com/c ...

  9. 深入理解 Python 异步编程(上)

    http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...

随机推荐

  1. c++中 cin、cin.get()、cin.getline()、cin.getchar()的区别

    ①cin>>:无法接收空格.Tap键且以空格.Tap键.回车符为分隔符: ②cin.get( ):可以接收空格.Tap键且以回车符为结束符: 一:可输入单个字符 格式: char ch; ...

  2. MySql中的变量定义(转)

    根据mysql手册,mysql的变量分为两种:系统变量和用户变量.但是在实际使用中,还会遇到诸如局部变量.会话变量等概念.根据个人感觉,mysql变量大体可以分为四种类型: 一.局部变量. 局部变量一 ...

  3. redis配置文件redis.conf详细说明

    # By default Redis does not run as a daemon. Use 'yes' if you need it.# Note that Redis will write a ...

  4. CentOS下安装vsftpd架设ftp服务器

    什么是vsftpd vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序.特点是小巧轻快,安全易用. 首先安装vsftpd这个软件,命令是,yum install vsftpd servi ...

  5. destoon程序中qq号码,手机号,msn必选项实现方法

    最近发现好多客户,信息不完全!还是把qq号码,手机号,msn设为必选项比较好!下面以把qq设为必选项为例找到模板 template/default/member/edit.htm 找到 functio ...

  6. php单例模式在数据库连接中的使用

    今天同事问到一个关于单例模式在php中是否有用的问题,我们知道,单例的目的是为了避免重复生产相同的对象,一般情况在数据库连接中,为了避免多次拿到相同数据库连接,使用到单例模式,我们来看一下单例模式数据 ...

  7. .NET MVC 插件化框架源码

    本来想把源码整理了放github上,但最近一直忙,就直接在这里放出来了,还写得不太完整,里面有几个例子,插件上传也没写,只写了插件zip包解压,如果大家在使用中有什么疑问,可以加QQ群:1429391 ...

  8. elasticsearch 重启后,需要的操作

    如果elasticsearch 集群挂了,请勿开启Logstash 同步数据,需等待elasticsearch集群恢复后,在继续写入

  9. makefile高级用法--使用函数

    makefile高级用法--使用函数 分类: C/C++ 使用函数 ———— 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多, ...

  10. HDOJ(HDU) 1406 完数

    Problem Description 完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3:28=1+2+4+7+14. 本题的任务是 ...