在Node.js中并发

时间:2018-07-31 17:03:51

标签: node.js concurrency

我有如下所示的节点服务器。我推2请求 几乎同时(使用相同的url =“ localhost:8080 /”)。 我的问题是:“为什么服务器等待第一个请求处理完成,然后第二个请求将被处理”?

  • 我的测试控制台中的输出:
Home..
Home.. 

(注意:12秒后将显示第二行) -server.js:


    var express = require('express')
    var app = express()
    app.use(express.json())

    app.get('/', async(request, response) => {
        try {
            console.log('Home ...')
            await sleep(12000)
            response.send('End')
        } catch (error) {
            response.end('Error')
        }
    })


    function sleep(ms) {
      return new Promise(resolve => setTimeout(resolve, ms));
    }

    var server = app.listen(8080, '127.0.0.1', async () => {
        var host = server.address().address
        var port = server.address().port
        console.log('====================  START SERVER  ===================')
        console.log('* Running on http://%s:%s (Press CTRL+C to quit)', host, port)
        console.log('* Create time of ' + new Date() + '\n')
    })


3 个答案:

答案 0 :(得分:1)

同意@unclexo-了解什么是阻塞/非阻塞调用,并围绕此优化您的代码。如果您确实想增加并行请求的容量,则可以考虑利用集群模块。

https://nodejs.org/api/cluster.html

这将启动子进程并将HTTP请求代理到那些子进程。每个孩子都可以根据自己的意愿进行阻止,并且不会影响其他进程(除非它们之间存在某些竞赛条件)。

答案 1 :(得分:0)

  

“为什么服务器等待第一个请求句柄完成,然后等待第二个请求   将被处理”?

这不适用于Node.Js。您正在代码中进行同步和异步调用。对sleep()方法的异步调用等待12秒才能运行。

现在,这并不意味着异步调用要等到同步调用完成后才能进行。这是同步行为。请注意以下示例

asyncFunction1()
asyncFunction2()
asyncFunction3() 

这里,每当第一个函数开始运行时,node.js释放线程/块,然后第二个函数开始运行,再次节点释放线程,因此对第三个函数的调用开始。每个函数在完成时都会返回响应,而不必等待其他函数的返回。

NodeJ是单线程的或具有无阻塞的I / O架构。异步功能是它的美丽。

答案 2 :(得分:0)

您通过在<meta http-equiv="X-UA-Compatible" content="IE=edge" />上调用await来阻止其他请求。 如果希望sleep方法在请求之间异步运行,请将其包装在新的异步函数中。代码将如下所示:

app.get('/'...

这样,如果您发送一个请求然后发送另一个请求,则第二个请求的print()函数将被执行,而无需等待第一个请求之后的12秒。因此,在发送请求后约12秒将打印2 app.get('/', (request, response) => { try { print() response.send('End') } catch (error) { response.end('Error') } }) async function print() { await sleep(12000) console.log('Home ...') } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } 。要对此有更多的了解,您应该了解NodeJS事件循环。