Handling multiple parallel HTTP requests in Node.js

后端 未结 4 591
死守一世寂寞
死守一世寂寞 2021-01-07 19:12

I know that Node is non-blocking, but I just realized that the default behaviour of http.listen(8000) means that all HTTP requests are handled one-at-a-time. I

4条回答
  •  鱼传尺愫
    2021-01-07 19:28

    I used following code to test request handling

    app.get('/', function(req, res) {
      console.log('time', MOMENT());  
      setTimeout( function() {
        console.log(data, '          ', MOMENT());
        res.send(data);
        data = 'changing';
      }, 50000);
      var data = 'change first';
      console.log(data);
    });
    

    Since this request doesn't take that much processing time, except for 50 sec of setTimeout and all the time-out were processed together like usually do.

    Response 3 request together-

    time moment("2017-05-22T16:47:28.893")
    change first
    time moment("2017-05-22T16:47:30.981")
    change first
    time moment("2017-05-22T16:47:33.463")
    change first
    change first            moment("2017-05-22T16:48:18.923")
    change first            moment("2017-05-22T16:48:20.988")
    change first            moment("2017-05-22T16:48:23.466")
    

    After this i moved to second phase... i.e., what if my request takes so much time to process a sync file or some thing else that take time.

    app.get('/second', function(req, res) {
        console.log(data);
        if(req.headers.data === '9') {
            res.status(200);
            res.send('response from api');
        } else {
            console.log(MOMENT());
            for(i = 0; i<9999999999; i++){}
            console.log('Second MOMENT', MOMENT());
            res.status(400);
            res.send('wrong data');
        }
    
        var data = 'second test';
    });
    

    As my first request was still in process so my second didn't get accepted by Node. Thus i got following response of 2 request-

    undefined
    moment("2017-05-22T17:43:59.159")
    Second MOMENT moment("2017-05-22T17:44:40.609")
    undefined
    moment("2017-05-22T17:44:40.614")
    Second MOMENT moment("2017-05-22T17:45:24.643") 
    

    Thus For all Async functions theres a virtual thread in Node and Node does accept other request before completing previous requests async work like(fs, mysql,or calling API), however it keeps it self as single thread and does not process other request until all previous ones are completed.

提交回复
热议问题