使用Node.js TCP服务器处理数据时是否可能遇到竞争条件?

使用Node.js TCP服务器处理数据时是否可能遇到竞争条件?,node.js,tcp,Node.js,Tcp,我正在使用Node.js设置一个TCP服务器,在“data”事件中,我将数据传递给parser对象的实例,该实例处理数据,然后推送到云端。我的问题是,如果第一个on data事件尚未完成处理,但同一TCP连接的第二个on“data”事件已触发,那么数据会发生什么情况,第二个数据包是否会与第一个数据包“并发”处理 此TCP服务器用于处理多个连接,每个连接都在连续处理相当大的数据量。对数据进行顺序处理很重要 var net = require('net'); const rfDataParser =

我正在使用Node.js设置一个TCP服务器,在“data”事件中,我将数据传递给parser对象的实例,该实例处理数据,然后推送到云端。我的问题是,如果第一个on data事件尚未完成处理,但同一TCP连接的第二个on“data”事件已触发,那么数据会发生什么情况,第二个数据包是否会与第一个数据包“并发”处理

此TCP服务器用于处理多个连接,每个连接都在连续处理相当大的数据量。对数据进行顺序处理很重要

var net = require('net');
const rfDataParser = require('./MyDataParser');
const HOST = 'localhost'
const PORT = 8000;

var server = net.createServer(onClientConnected);

function onClientConnected(sock) {
    const parser = new rfDataParser();
    sock.on('data', function(data) {
        parser.parse(data);
    }
}

server.listen(PORT, HOST, function() {  
    console.log('server listening on %j', server.address());
});

我希望在第一个“数据”事件的数据完成处理之前,第二个“数据”事件的数据不会得到处理。

您在这里提出了两个不同的问题

第二个数据包是否与第一个数据包“同时”处理

否,如果仍在处理第一个事件,则事件循环将排队处理第二个事件。Node.js是一个单线程平台;JS文件中的两行不可能同时执行

有可能遇到比赛条件吗

是的,当您的代码在单个线程中运行时,节点本身依赖多个线程来处理I/O。如果您的处理包括异步I/O,并且在调用作业完成之前不等待回调,则可能存在争用条件


您可以阅读有关事件循环的更多信息。

谢谢您的回答!为什么不能保证TCP请求的接收顺序与发送顺序相同?我认为TCP确保数据包按顺序到达,而UDP则不按顺序到达。或者是Node.js中有什么东西可能会打乱顺序?1只有一个问题,它是关于竞争条件的,与到达顺序无关。2 TCP保证正确的数据顺序。3您的引文明确指出,只有一个线程,由操作系统中的异步I/O操作支持。这不需要多个线程。@user207421感谢您的澄清!那么,我可以假设Ismail对并发性的回答是正确的吗?@user207421 2这仅对每个单独的连接是正确的。对答案进行了编辑,使其更加清晰。3所有javascript都在一个线程中运行,但是,node有一个工作线程池,其中有少量线程来处理I/O@zsedcx。node中的任何内容都不会扰乱排序,我的回答不够清楚。请检查更新的。