NODEJS
Node.js 使用单线程事件循环和非阻塞 I/O 模型。所有 I/O 操作(如文件读写、网络请求等)都是异步的,不会阻塞主线程。事件循环机制使得 Node.js 能够高效地处理大量并发请求
尽可能的返回 暂时没有看这个代码
function handleResult(index, result, resultsArray, resolve, allPromisesCount) {
resultsArray[index] = result; // 将结果保存到对应的位置
// 检查是否所有结果都已经完成
if (resultsArray.every(item => item !== undefined)) {
resolve(resultsArray); // 如果所有Promise都完成,则解决最终的Promise
}
}
function handleAllPromises(promises) {
return new Promise(resolve => {
const results = new Array(promises.length); // 创建一个数组来存储结果
promises.forEach((promise, index) => {
promise.then(result => {
console.log(`Promise ${index + 1} resolved with:`, result);
handleResult(index, result, results, resolve, promises.length);
}).catch(error => {
console.error(`Promise ${index + 1} failed with:`, error);
handleResult(index, { error: true, message: error }, results, resolve, promises.length);
});
});
});
}
// 示例使用
const promise1 = Promise.resolve(42);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, '失败'));
const promise3 = new Promise((resolve) => setTimeout(resolve, 200, '成功'));
handleAllPromises([promise1, promise2, promise3])
.then(allResults => {
console.log('All promises are completed:', allResults);
});
Java
-
多线程编程:
-
非阻塞 I/O (NIO):
Go
阻塞I/O
-
Java:
-
Python:
- Python的标准库中的大多数IO操作默认是阻塞的。
- 例如,open()函数打开的文件对象、socket模块的基本操作等
-
C:
- C语言的标准IO库(如fread(), fwrite())默认是阻塞的。
- 系统调用如read()和write()在默认情况下也是阻塞的。
advantage of Blocking IO
非阻塞和异步是一个东西吗
同步异步 阻塞和非阻塞
https://juejin.cn/post/6844903683583377416?searchId=202408020617186FF13CCF5F52FAC4972C
阻塞、非阻塞说的是调用者,同步、异步说的是被调用者
同步 非阻塞 ?
Callback 和原有函数的执行顺序问题
callback由谁来执行
是由主线程执行 还是 greet执行呢 => JS是单线程语言
function greet() {
console.log('Hello, world!');
}
console.log('This message will be displayed first.');
setTimeout(greet, 2000);
console.log('This message will be displayed second.');
function downloadFile(url, callback) {
console.log("Starting the download from:", url);
setTimeout(() => { // 模拟异步的文件下载操作
const downloadedData = "Some data from " + url; // 假设的下载数据
callback(downloadedData); // 调用回调函数处理下载的数据
}, 2000);
console.log("end??")
unction processData(data) {
console.log("Processing data:", data);
}
downloadFile("http://example.com/file", processData);
变量的作用域
for (let i = 0; i < 3; i++) {
console.log(i);
setTimeout(function() {
console.log(i); // 每个 setTimeout 引用的都是不同的 'i' 实例
}, 100 * i);
}
// 输出: 0 1 2 0, 1, 2 (每个输出间隔 100ms)
for (var i = 0; i < 3; i++) {
console.log(i);
setTimeout(function() {
console.log(i); // 所有的 setTimeout 引用的都是同一个 'i'
}, 100 * i);
}
// 输出: 0 1 2 3, 3, 3 (每个输出间隔 100ms)