Node.js与Golang使用感受与小结【三】--Nodejs JS异步流程控制(序列模式、并发模式、有限并发模式)

Node.js与Golang使用感受与小结【三】–Nodejs JS异步流程控制(序列模式、并发模式、有限并发模式)

接触golang有一段时间了,也想对比一下两者来的。

3 回复

好的,以下是针对标题“Node.js与Golang使用感受与小结【三】–Nodejs JS异步流程控制(序列模式、并发模式、有限并发模式)”的内容:


Node.js与Golang使用感受与小结【三】–Nodejs JS异步流程控制(序列模式、并发模式、有限并发模式)

接触Node.js有一段时间了,也想分享一下在实际开发中使用Node.js时的一些体验。本文将重点讨论Node.js中的异步流程控制,并通过具体示例来说明序列模式、并发模式和有限并发模式的实现。

序列模式

在序列模式下,任务按顺序执行,每个任务必须在前一个任务完成后才能开始执行。这种模式非常适合需要按步骤执行的任务,例如文件读写操作。

const fs = require('fs');

function readFileSync(file) {
    return fs.readFileSync(file, 'utf8');
}

function writeFileSync(file, data) {
    fs.writeFileSync(file, data);
}

// 序列模式
readFileSync('input.txt')
    .then(data => {
        console.log('Read file:', data);
        return writeFileSync('output.txt', data);
    })
    .then(() => {
        console.log('Write file completed.');
    })
    .catch(err => {
        console.error('Error:', err);
    });

并发模式

在并发模式下,多个任务可以同时执行。这种模式适合于不需要按顺序执行的任务,例如并行下载多个资源。

const axios = require('axios');

async function downloadFile(url) {
    const response = await axios.get(url, { responseType: 'stream' });
    return new Promise((resolve, reject) => {
        response.data.pipe(fs.createWriteStream(`./${url.split('/').pop()}`))
            .on('finish', resolve)
            .on('error', reject);
    });
}

// 并发模式
Promise.all([
    downloadFile('https://example.com/file1'),
    downloadFile('https://example.com/file2')
])
    .then(() => {
        console.log('All files downloaded.');
    })
    .catch(err => {
        console.error('Error:', err);
    });

有限并发模式

有限并发模式允许同时执行的任务数量有限制,这样可以避免资源过度消耗。这种模式适合于需要控制并发量的任务,例如批量处理数据。

const queue = require('async-priority-queue');

async function processItem(item) {
    // 模拟耗时操作
    await new Promise(resolve => setTimeout(resolve, 1000));
    console.log(`Processed item: ${item}`);
}

const q = queue(async (item, done) => {
    await processItem(item);
    done();
}, { concurrency: 3 }); // 限制并发数为3

['item1', 'item2', 'item3', 'item4', 'item5'].forEach(item => {
    q.push(item);
});

q.drain(() => {
    console.log('All items processed.');
});

以上示例展示了如何在Node.js中实现不同的异步流程控制模式。希望这些示例能够帮助你更好地理解和应用Node.js中的异步编程技巧。

更多关于Node.js与Golang使用感受与小结【三】--Nodejs JS异步流程控制(序列模式、并发模式、有限并发模式)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


欢迎交流

当然可以。以下是关于Node.js中JS异步流程控制的序列模式、并发模式和有限并发模式的总结和示例代码。

序列模式

在序列模式中,任务是依次执行的。每个任务都必须等待前一个任务完成之后才能开始。

const async = require('async');

async.series([
    function(callback) {
        setTimeout(() => {
            console.log('Task 1');
            callback(null, 'Result of Task 1');
        }, 1000);
    },
    function(callback) {
        setTimeout(() => {
            console.log('Task 2');
            callback(null, 'Result of Task 2');
        }, 500);
    }
], function(err, results) {
    if (err) throw err;
    console.log('All tasks completed:', results);
});

并发模式

在并发模式中,所有任务同时执行,不考虑顺序。

const async = require('async');

async.parallel([
    function(callback) {
        setTimeout(() => {
            console.log('Task 1');
            callback(null, 'Result of Task 1');
        }, 1000);
    },
    function(callback) {
        setTimeout(() => {
            console.log('Task 2');
            callback(null, 'Result of Task 2');
        }, 500);
    }
], function(err, results) {
    if (err) throw err;
    console.log('All tasks completed:', results);
});

有限并发模式

在有限并发模式中,允许一定数量的任务同时执行。其他任务会排队等待。

const async = require('async');

async.eachLimit([1, 2, 3, 4, 5], 2, (item, callback) => {
    setTimeout(() => {
        console.log(`Processing ${item}`);
        callback();
    }, 1000 * item);
}, (err) => {
    if (err) throw err;
    console.log('All items processed');
});

总结

  • 序列模式适合任务之间有依赖关系的情况。
  • 并发模式适合任务之间没有依赖关系且需要尽快完成的情况。
  • 有限并发模式适合需要限制同时执行的任务数量以避免资源过载的情况。

以上代码展示了如何在Node.js中实现这些不同的异步流程控制模式。希望对你有所帮助!

回到顶部