learnyounode #9 jugggling async,官方解决方案可以破解吗?
learnyounode #9 juggling async, can official solution break?
所以我现在正在学习 node.js 并且之前做过一些多任务处理,我的概念是异步和多任务处理有很多相似的问题,这让我想到了我的问题。
这个问题的官方解决方案是:
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 OF INTEREST START
count++
if (count == 3)
printResults()
//AREA OF INTEREST END
}))
})
}
for (var i = 0; i < 3; i++)
httpGet(i)
注意 'AREA OF INTEREST' 评论中的部分。难道这里不会出现竞争条件之类的情况导致多次调用 printResults 函数吗?
例如,所有三个 'end' 回调同时出现,每个都执行 count++
一个接一个(因此 count == 3
检查尚未发生在任何回调上,但计数已经增加三次)现在他们每个人都将检查 count == 3
条件,这对所有调用 printResults
三次
的人来说都是正确的
这是否可能,官方解决方案有些缺陷还是我误解了一些概念?
不,竞争条件对于该代码来说不是问题。单线程中的回调 运行。他们不会 运行 同时并行。他们将运行连载。
有关回调如何排队以及为什么代码中没有竞争条件的更多信息,您可以选择观看a great video by Philip Roberts called "What the heck is the event loop anyway?"。
所以我现在正在学习 node.js 并且之前做过一些多任务处理,我的概念是异步和多任务处理有很多相似的问题,这让我想到了我的问题。
这个问题的官方解决方案是:
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 OF INTEREST START
count++
if (count == 3)
printResults()
//AREA OF INTEREST END
}))
})
}
for (var i = 0; i < 3; i++)
httpGet(i)
注意 'AREA OF INTEREST' 评论中的部分。难道这里不会出现竞争条件之类的情况导致多次调用 printResults 函数吗?
例如,所有三个 'end' 回调同时出现,每个都执行 count++
一个接一个(因此 count == 3
检查尚未发生在任何回调上,但计数已经增加三次)现在他们每个人都将检查 count == 3
条件,这对所有调用 printResults
三次
这是否可能,官方解决方案有些缺陷还是我误解了一些概念?
不,竞争条件对于该代码来说不是问题。单线程中的回调 运行。他们不会 运行 同时并行。他们将运行连载。
有关回调如何排队以及为什么代码中没有竞争条件的更多信息,您可以选择观看a great video by Philip Roberts called "What the heck is the event loop anyway?"。