Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js数组切片操作为;线程安全;?_Node.js_Websocket - Fatal编程技术网

Node.js数组切片操作为;线程安全;?

Node.js数组切片操作为;线程安全;?,node.js,websocket,Node.js,Websocket,我有一个简单的websocket聊天服务器,可以处理多个客户端。我使用数组跟踪所有客户端,并在客户端关闭连接时对数组进行切片 我想知道当多个客户端同时关闭连接时,切片阵列是否会导致问题 以下是代码段: var clients = []; var wsServer = new webSocketServer ({ httpServer: httpserver }); wsServer.on('request', function(request) { var connectio

我有一个简单的websocket聊天服务器,可以处理多个客户端。我使用数组跟踪所有客户端,并在客户端关闭连接时对数组进行切片

我想知道当多个客户端同时关闭连接时,切片阵列是否会导致问题

以下是代码段:

var clients = []; 
var wsServer = new webSocketServer ({
    httpServer: httpserver
});

wsServer.on('request', function(request) {
    var connection = request.accept(null, request.origin);
    var index = clients.push(connection) - 1;

....

connection.on('close', function(connection) {
    for (var i=0; i<clients.length; i++) 
        if (i != index) clients[i].sendUTF('Some client has left the chat!');

    //At this point some other clients may have disconnected and the above 
    //for-loop may be running for another connection.

   clients.splice(index, 1);

   //After the array has been sliced, will the for-loop for other 
   //connection(s) fail?
var客户机=[];
var wsServer=新的webSocketServer({
httpServer:httpServer
});
wsServer.on('request',函数(request){
var connection=request.accept(null,request.origin);
var索引=clients.push(连接)-1;
....
connection.on('close',函数(connection){

对于(var i=0;iJavascript是单线程的,所以是的,
Array.splice
是线程安全的

异步回调只能在调用堆栈为空时进入调用堆栈。因此,如果调用堆栈上存在
Array.splice
,则包含
Array.splice
的另一个回调必须等待第一个回调完成

const arr = [1,2,3,4];
request('http://foo.com', (err, res, body) => {
   arr.splice(0, 1)
});

request('http://bar.com', (err, res, body) => {
   arr.splice(0, 1)
});
考虑上面的代码段。如果这些请求同时完成(为了参数起见,请想象一下)。然后一个回调,
foo.com
bar.com
将进入调用堆栈。All将执行该回调中的同步代码(将执行异步调用,但不会执行回调),并且在调用堆栈为空之前,无法处理来自另一个请求的回调。因此,
foo.com
bar.com
回调不能同时处理


Javascript是单线程的,它有一个调用堆栈,因此它一次只能做一件事。

使Node.js开发超级容易的一个因素是它具有知道同步块中的所有内容都是“线程安全”的安全性,并且能够使用回调显式地确定任何异步操作的控制流(或者现在更常见的承诺)。事实上,它让您心平气和,知道您不必担心那个噩梦。感谢您的回答。我现在理解了,这让我发现了代码中的错误(与此问题无关):)不客气。我建议观看这段视频,它可以很好地解释这一点: