Node.js 异步回调块NodeJS

Node.js 异步回调块NodeJS,node.js,Node.js,我有一个基于服务器客户端的NODE.JS应用程序 server.js client.js 处理一些数据函数大约需要4秒钟才能完成,当我只有一个客户端时,这不是问题,但如果我有10个客户端,它们都会阻塞并等待最后一个客户端完成 我发现整个套接字事件都会等到他完成当前作业,例如,如果我对一些数据进行注释,它将不会被冻结 我尝试了2次调整,但都没有成功: ... socket.on('message', function(message) { if(message.code == 103)

我有一个基于服务器客户端的NODE.JS应用程序

server.js

client.js

处理一些数据函数大约需要4秒钟才能完成,当我只有一个客户端时,这不是问题,但如果我有10个客户端,它们都会阻塞并等待最后一个客户端完成

我发现整个套接字事件都会等到他完成当前作业,例如,如果我对一些数据进行注释,它将不会被冻结

我尝试了2次调整,但都没有成功:

...
socket.on('message', function(message) {
    if(message.code == 103)
    {
        setTimeout(function() {
            process_some_data();

            console.log("FINISH");
        }, 1)
    }
    else
    {
        console.log("UNKNOWN MESSAGE");
    }
});
...
甚至用过,但没有用:

...
socket.on('message', function(message) {
    if(message.code == 103)
    {
        // Array to hold async tasks
        var asyncTasks = [];

        async.series([
            setTimeout(function() {

                process_some_data();

                console.log("FINISH");
            }, 1)
        ], function (err, results) {
            console.log(results);
        });
    }
    else
    {
        console.log("UNKNOWN MESSAGE");
    }
});
...
如何使其异步?我真的需要这个


谢谢。

使用Javascript需要多个进程来解决这个问题,因为Javascript引擎是单线程的

什么 当涉及到处理I/O事件时,例如读取套接字、写入文件或等待信号,Javascript引擎提供了同时执行多个操作的外观

事实并非如此:只是在大多数情况下,处理这些事件所需的计算量非常小,而事件本身发生的时间非常长,对于CPU来说,一微秒是永恒的,因此引擎可以一个接一个地处理这些事件,并留有大量的空闲时间

在人类的时间尺度上,看起来引擎在并行地做很多事情,但它只是以很高的速度连续工作

无论您如何使用setTimeout或Promise安排代码运行,它仍然会在其活动计算期间阻止处理其他事件。以秒为单位而不是以毫秒为单位的长时间运行的计算暴露了引擎的单线程特性:它实际上不能同时做多件事情

多进程 然而,您的计算机可能有多个CPU核。与Javascript引擎不同,您的硬件能够同时处理多个任务,每个核心至少处理一个任务。即使只有一个内核,如果您运行多个进程,您的操作系统也可以解决这个问题

由于单个Javascript进程是单线程的,因此需要多个Javascript进程。解决您的问题的简单且经时间验证的体系结构如下:

一个Javascript程序在一个进程中运行,从套接字读取数据。然而,它不是调用process_一些_数据,而是将所有传入的消息放入一个队列中

然后,该程序将项目从队列发送到另一个Javascript程序,该程序在另一个进程中运行,该程序使用另一个CPU核心执行计算。第二个过程可能有多个副本。在现代计算机中,有两倍于CPU核心的活动进程是有意义的

Node的一种简单方法是使用express编写一个HTTP服务器,以运行计算密集型任务。然后,主程序可以使用HTTP将任务委托给工作者,同时仍然能够从套接字读取


这是一篇关于使用集群API对节点进行多处理的好文章。

Node在单线程上运行。因此,您的所有解决方案都无法运行。您可以尝试在另一个进程中运行该函数,它不会阻止。。。当它完成时发送一条消息,因此它将是异步的。看起来您正在进程中同步执行一些阻塞IO操作。那么为什么处理一些数据函数需要这么长的时间,为什么它会阻塞所有的东西呢???@Alon如何做到这一点??Molda->它正在运行一些linux命令,需要时间,我无法更改that@DancoD我们需要查看一些process_数据来告诉您如何使其异步,它不应该在linux命令运行时阻塞,它应该继续并解决一个承诺,或者在命令完成后调用回调。根据问题的评论,这听起来像是进程\u一些\u数据调用了一些外部进程。无论如何,4秒不是由于Javascript中的计算,只需要异步。多个CPU核也不是必需的。一台有一个内核的计算机可以处理一些node.js I/O,而另一个进程正在运行,尽管是暂停的,因为操作系统将处理进程之间的调度和上下文切换。感谢您的回答,我得到了答案。你说的HTTP服务器太复杂了,我知道怎么做,但它太复杂了,但是这个集群api可能是我想要的,我必须首先理解和测试它。我不得不说,我很失望,我的意思是,如果你觉得我。。。希望node也这样做…@DancoD您不需要单独的线程,只需要让process\u一些\u数据异步而不是同步地运行其他linux命令。如果您显示该函数的一些代码,有人将能够帮助您。我不能,我需要输出的结果并发送回客户端,这不应该是一个问题。您应该能够异步回复客户机。
...
socket.on('message', function(message) {
    if(message.code == 103)
    {
        setTimeout(function() {
            process_some_data();

            console.log("FINISH");
        }, 1)
    }
    else
    {
        console.log("UNKNOWN MESSAGE");
    }
});
...
...
socket.on('message', function(message) {
    if(message.code == 103)
    {
        // Array to hold async tasks
        var asyncTasks = [];

        async.series([
            setTimeout(function() {

                process_some_data();

                console.log("FINISH");
            }, 1)
        ], function (err, results) {
            console.log(results);
        });
    }
    else
    {
        console.log("UNKNOWN MESSAGE");
    }
});
...