• Node单线程与异步编程的初步理解


    最近学习了一些关于node的单线程与异步的知识,想拿过来和大家分享下:

    var async = require('async')
    //并行无关联,等待事件为最长时间请求过程。如以下两个任务执行时间
    console.time('test')
    async.parallel([
        function (callback) {
            //执行任务一:2000ms之后执行完成
            setTimeout(function(){
                callback(null, 'one');
            }, 2000);
        },
        function (callback) {
            //执行任务二:3000ms之后执行完成
            setTimeout(function(){
                callback(null, 'two')
            }, 3000);
        }],function(err, results){
            console.log(results);
            console.timeEnd('test');
        })
    console.log("其他任务");

      在上面这段代码中,执行结果如下,执行了3023多ms,说明异步执行,但是这让我想到了类似Java中的多线程,但是不是说node是单线程吗?这引起了我想探究node到底底层是怎样的实现异步编程的好奇心。

    其他任务
    [ 'one', 'two' ]
    test: 3023.991ms

      于是我写了下面这些代码做探究

    var async = require('async')
    //并行无关联,等待事件为最长时间请求过程
    console.time('test')
    async.parallel([
        function (callback) {
            //执行任务一
            wait(2000);
            callback(null, 'one');
        },
        function (callback) {
            //执行任务二
            wait(2000);
            callback(null, 'two')
        }],function(err, results){
            console.log(results);
            console.timeEnd('test');
        })
    
    console.log("其他任务");
    
    //等待时间
    function wait(m) {
        var now=new Date();
        while(new Date()-now<=m){}
            console.log("wait:"+m+"ms");
    }

      上面的代码执行的结果如下:

    wait:2000ms
    wait:2000ms
    [ 'one', 'two' ]
    test: 4011.518ms
    其他任务

      竟然执行了4011多ms,这就奇怪了,async.parallel不是并行无关联的吗?于是我查看相关资料,看到了一个比喻,用来形容单线程与异步的关系比较恰当

     

     我们写的js代码就像是一个国王,而nodejs给国王提供了很多"仆人"。早上,一个仆人叫醒了国王,问他有什么需要。国王给他一份清单,上面列举了所有需要完成的任务,然后睡回笼觉去了。当国王回去睡觉之后,仆人才离开国王,拿着清单,给其它的仆人一个个布置任务。仆人们各自忙各自的去了,直到完成了自己的任务后,才回来把结果禀告给国王。国王一次只召见一个人,其它的人就在外面排着队等着。国王处理完这个结果后,可能给他布置一个新的任务,或者就直接让他走了,然后再召见下一个人。等所有的结果都处理完了,国王就继续睡觉去了。直接有新的仆人完成任务后过来找他。这就是国王的幸福生活。

      现在再回过头来想之前两段代码,相信大家就会明白了。

      希望这个例子对大家能够有所帮助。

  • 相关阅读:
    USACO第三道题
    uva350 PseudoRandom Numbers
    uva10879 Code Refactoring
    Scrum 冲刺第一篇 晨曦
    WC.exe 晨曦
    [LeetCode 126] 单词梯II(Word Ladder II)
    [LeetCode 129] 根节点到叶子节点数字求和(Sum Root to Leaf Numbers)
    [LeetCode 125] 验证回文(Valid Palindrome)
    [LeetCode 123] 买入与卖出股票的最佳时机III(Best Time to Buy and Sell Stock III)
    [LeetCode 124] 二叉树最大路径和(Binary Tree Maximum Path Sum)
  • 原文地址:https://www.cnblogs.com/RuMengkai/p/6440082.html
Copyright © 2020-2023  润新知