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

  1. 多线程编程

    • Java 提供了强大的多线程支持,开发者可以通过创建线程或使用线程池来处理并发任务。Java 的 java.util.concurrent 包提供了丰富的并发工具类,如 Executor 框架、并发集合等
  2. 非阻塞 I/O (NIO)

    • Java NIO 提供了非阻塞 I/O 操作,可以在一个线程中处理多个 I/O 操作,避免了传统阻塞 I/O 的性能瓶颈。NIO 包含了选择器(Selector)、通道(Channel)和缓冲区(Buffer)等组件

Go

阻塞I/O

  1. Java:

    • 传统的Java IO API(如java.io包)默认使用阻塞IO
    • Java的Socket和ServerSocket类默认也是阻塞的。
  2. Python:

    • Python的标准库中的大多数IO操作默认是阻塞的。
    • 例如,open()函数打开的文件对象、socket模块的基本操作等
  3. 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)