Node.js:在 tcp 套接字上接收数据时的竞争条件
Node.js: Race condition when receiving data on tcp socket
我正在使用 Node.js 的网络库连接到正在发布数据的服务器。所以我在客户端监听 'data'-events。当触发数据事件时,我将接收到的数据附加到我的 rx 缓冲区,并通过读取一些字节来检查我们是否获得了完整的消息。如果我收到一条有效消息,我会从缓冲区中删除该消息并对其进行处理。源代码如下所示:
rxBuffer = ''
client.on('data', (data) => {
rxBuffer += data
// for example... 10 stores the message length...
while (rxBuffer.length > 10 && rxBuffer.length >= (10 + rxBuffer[10])) {
const msg = rxBuffer.slice(0, 10 + rxBuffer[10])
rxBuffer = rxBuffer.slice(0, msg.length) // remove message from buffer
processMsg(msg) // process message..
}
})
据我所知,典型的方式。但是……如果多次触发数据事件会怎样?所以,假设我正在获取一个数据事件,当我将数据附加到我的 rx 缓冲区时,我正在获取下一个数据事件。所以 "new" 数据事件也会将数据附加到 rxBuffer 并启动我的 while 循环。所以我有两个正在处理相同消息的处理程序,因为它们共享相同的接收缓冲区。这个对吗?
我该如何处理?在其他语言中,我会说使用类似互斥锁的东西来防止对 rx 缓冲区的多次访问......但是 js 的解决方案是什么?!?!或者也许我错了,当一个事件仍然处于活动状态时,我永远不会收到多个数据事件?有什么想法吗?
JavaScript 是单线程的。在第一个事件完成或阻塞之前,第二个事件不会 运行,后者可能会发生在您的 processMsg()
中。如果是这样的话, processMsg()
的多次执行可以交错进行。如果他们没有更改任何全局数据(包括 rxBuffer
),那么您应该没有问题。
我正在使用 Node.js 的网络库连接到正在发布数据的服务器。所以我在客户端监听 'data'-events。当触发数据事件时,我将接收到的数据附加到我的 rx 缓冲区,并通过读取一些字节来检查我们是否获得了完整的消息。如果我收到一条有效消息,我会从缓冲区中删除该消息并对其进行处理。源代码如下所示:
rxBuffer = ''
client.on('data', (data) => {
rxBuffer += data
// for example... 10 stores the message length...
while (rxBuffer.length > 10 && rxBuffer.length >= (10 + rxBuffer[10])) {
const msg = rxBuffer.slice(0, 10 + rxBuffer[10])
rxBuffer = rxBuffer.slice(0, msg.length) // remove message from buffer
processMsg(msg) // process message..
}
})
据我所知,典型的方式。但是……如果多次触发数据事件会怎样?所以,假设我正在获取一个数据事件,当我将数据附加到我的 rx 缓冲区时,我正在获取下一个数据事件。所以 "new" 数据事件也会将数据附加到 rxBuffer 并启动我的 while 循环。所以我有两个正在处理相同消息的处理程序,因为它们共享相同的接收缓冲区。这个对吗? 我该如何处理?在其他语言中,我会说使用类似互斥锁的东西来防止对 rx 缓冲区的多次访问......但是 js 的解决方案是什么?!?!或者也许我错了,当一个事件仍然处于活动状态时,我永远不会收到多个数据事件?有什么想法吗?
JavaScript 是单线程的。在第一个事件完成或阻塞之前,第二个事件不会 运行,后者可能会发生在您的 processMsg()
中。如果是这样的话, processMsg()
的多次执行可以交错进行。如果他们没有更改任何全局数据(包括 rxBuffer
),那么您应该没有问题。