Tag: 竞争条件

数组操作中的Node.JS竞态条件

是否有可能遇到竞争条件在Node.JS如果我是例如添加元素到数组和同时过滤该数组? 例: 我正在推动一些数组,而filter正在运行… 有没有机会元素不会被添加?

在asynchronous比赛中使用第一个结果/获胜者将参加所有比赛

基本上,我想打两个asynchronous调用对方,只使用赢家。 我似乎无法弄清楚如何做到这一点,只有如何防止它。 这是远程可能的吗? Lame伪代码: //rigging a race function MysqlUser() { setTimeout(function(){ return "mysqluser"; }, 500); } function ADUser() { setTimeout(function(){ return "aduser"; }, 1000); } function getUser() { var user = null; user = ADBind(); user = MysqlBind(); //if user != null return user; //else? } 我想(在这种情况下)为MysqlUser胜过ADUser。 任何帮助,将不胜感激。

async.auto中的竞争条件

我正在使用async.each如下所示: async.each(students, plan(student, callback), function(err) { ….. ….. }); plan(student, callback){ …… …… commonDS[student.id] = student.name; } 这里commonDS是函数调用的通用数据结构,所以在这里有竞争条件吗?

learnyounode#9杂耍asynchronous,可以正式解决吗?

所以我现在正在学习node.js,并且之前做了一些多任务处理,而我的概念是asynchronous和多任务处理有许多类似的isses,这就引出了我的问题。 这个问题的官方解决scheme是: var http = require('http') var bl = require('bl') var results = [] var count = 0 function printResults () { for (var i = 0; i < 3; i++) console.log(results[i]) } function httpGet (index) { http.get(process.argv[2 + index], function (response) { response.pipe(bl(function (err, data) { if (err) return console.error(err) results[index] = data.toString() //AREA […]

Node.js SQL争用条件

我想知道在执行IO时如何防止NodeJS中的竞争条件。 我一直在阅读,大家坚持认为竞争条件是不可能的,因为NodeJS是单线程的。 让我们看看下面的伪代码: async decreaseUserBalance(userId, amount) { const currentBalance = await sql.queryScalar('SELECT balance FROM user WHERE userid=?', [userId]); await sql.query('UPDATE user SET balance = ? WHERE userid = ?', [currentBalance – amount, userId]); } 假设数据库节点连接到负载较重,并且需要一些时间来完成每个请求,并且每次用户点击某个项目上的购买button时都会调用该函数。 当用户开始发送这个button或者让机器人发送购买请求时会发生什么? 在我的理解,第一个请求将执行SELECT查询,并恢复执行。 现在,由于用户正在垃圾邮件button,下一个请求进来,执行相同的function。 现在你有几个SELECT语句正在等待完成。 现在,几个select语句完成执行并执行callback,因此现在有几个callback函数正在执行UPDATE语句,所有语句都具有相同的余额。 这意味着,如果起始余额为5,那么所有这些数额都会从最后一个已知余额中减less。 所以基本上不pipe你同时执行这个查询的频率如何,第一批请求都将从SELECT查询中获得相同的值,并将其更新为一些假的。 对不起,如果我的解释有点模糊,但我认为这是一个非常现实的问题,我怀疑有很多人考虑。 所以要解决这个问题,Node是否支持类似互斥的东西? 从我读过的MongoDB不支持表锁,所以locking只能是SQL的一个选项。 编辑: 我知道我可以在1个查询中完成这个例子,这将解决它,但让我们说这是不可能的。 那你怎么解决呢? 编辑2: 好的,让我们看看这个例子: async tryBuyItem(userId, itemId, price) { […]

JavaScript中的数据竞争?

让我们假设我运行这段代码。 var score = 0; for (var i = 0; i < arbitrary_length; i++) { async_task(i, function() { score++; }); // increment callback function } 从理论上讲,我知道这表示一个数据竞赛,并且两个线程同时尝试增加可能会导致单个增量,但是,nodejs(和javascript)被称为单线程。 我保证得分的最终值将等于任意长度?

两个用户在socket.io中获得控制权限 – 竞争条件

两个或两个以上的用户被通知一个可用的房间。 我如何试图阻止它,并且使得一次只有一个用户可以得到通知。 socket.on('Check', function (room) { io.in(room).clients((error, clients) => { var hasPush = false; clients.forEach(function (clientId) { var client = io.sockets.connected[clientId]; if (client.hasPush) { hasPush = true; socket.emit('busy', room); return; } }, this); if (!hasPush) { socket.hasPush = true; socket.emit('available', room); } }); }); 我试图阻止使用共享variables,但没有奏效。 rooms = {}; socket.on('check', function (room) { if (!rooms[room]) { […]

为什么在主模块中使用setTimeout(0)和setImmediate()的行为未定义?

从nodejs事件循环文档中取下面的代码: // timeout_vs_immediate.js setTimeout(() => { console.log('timeout'); }, 0); setImmediate(() => { console.log('immediate'); }); 根据文件: 例如,如果我们运行以下不在I / O周期内的脚本(即主模块),则两个定时器的执行顺序是非确定性的,因为它受过程执行的约束。 为什么上述说法是正确的? 是否因为nodejs运行时实际上使用了多个线程来挑选必须执行的callback。 我的直觉是这样说的:有两个线程为setTimeout和setImmediate执行callback,所以当两者都可用时,这会导致竞争条件,因此输出将是非确定性的。 这是对的吗 ? 或者还有什么其他的原因是不确定的?