我想知道以下代码是否会导致对象i
中的整数context
具有无效值。到目前为止,我无法在实验中引起任何问题。
// Node.js (v10.19.0)
const Promise = require('promise')
// object accessed from different async processes in parallel
let context = {i: 0}
// create async functions
let funkMaker = function(i) {
return async function(context) {
context.i += 1;
console.log(`Funk${i} at ${Date.now()}: Incremented argument 'context.i' to: ${context.i}`);
return context.i
}
}
// create async processes
let funksArr = [];
for (k=1; k<101; k++) {
funksArr.push(funkMaker(k))
}
// invoke async processes in parallel
Promise.all(
funksArr.map(f => f(context))
).then(
x => console.log(`Promise.all resolved with ${x}`)
).catch(
e => console.log(`Promise.all raised an error:\n${e}`)
)
上面的代码产生以下输出(摘录):
Funk1 at 1584448782621: Incremented argument 'context.i' to: 1
Funk2 at 1584448782621: Incremented argument 'context.i' to: 2
Funk3 at 1584448782622: Incremented argument 'context.i' to: 3
Funk4 at 1584448782622: Incremented argument 'context.i' to: 4
Funk5 at 1584448782622: Incremented argument 'context.i' to: 5
Funk6 at 1584448782622: Incremented argument 'context.i' to: 6
Funk7 at 1584448782622: Incremented argument 'context.i' to: 7
Funk8 at 1584448782622: Incremented argument 'context.i' to: 8
Funk9 at 1584448782622: Incremented argument 'context.i' to: 9
正如您所看到的,似乎有几个进程在同一毫秒(上述context.i
至Funk3
)访问Funk9
。我对为什么整数context.i
仍然正确地递增且没有错误感到困惑。
非常欢迎有识之士。谢谢!
更新
为了在真实的系统线程中进行尝试,我调整了从this blog post窃取的代码,该代码使用crypto
和隐式libuv
在真实线程中执行。我仍然无法中断context.i
。老实说,我还是很困惑。
const crypto = require("crypto");
const start = Date.now();
let context = {i: 0}
function logHashTime(context) {
crypto.pbkdf2("a","b",100000,512,"sha512",() => {
context.i += 1;
console.log(`Hash: ${Date.now() - start},'context.i' incremented to: ${context.i}`);
});
}
for (i = 0; i < 100; i++) {
logHashTime(context)
}
输出(摘录)仍然是“精细”:
Hash: 1268,'context.i' incremented to: 1
Hash: 1460,'context.i' incremented to: 2
Hash: 1660,'context.i' incremented to: 3
Hash: 1907,'context.i' incremented to: 4
Hash: 2493,'context.i' incremented to: 5
Hash: 2673,'context.i' incremented to: 6
Hash: 3154,'context.i' incremented to: 7
Hash: 3215,'context.i' incremented to: 8
Hash: 3662,'context.i' incremented to: 9