JS的继发与并发有何区别?全面了解两种异步执行关系
2023-09-15 21:58:19
继发关系与并发关系的对比
特征 | 继发关系 | 并发关系 |
---|---|---|
执行顺序 | 一个异步操作完成后,另一个异步操作才会开始执行 | 两个或多个异步操作可以同时开始执行 |
代码编写 | 通常使用回调函数、Promise或async/await来实现 | 通常使用并行编程技术,如多线程或多进程来实现 |
适用场景 | 需要保证异步操作的执行顺序时 | 需要提高程序的执行效率时 |
优缺点 | 执行顺序可控,易于调试 | 执行效率高,但代码编写复杂,难以调试 |
继发关系的实现
继发关系通常使用回调函数、Promise或async/await来实现。
回调函数
回调函数是JavaScript中常用的异步编程技术。当一个异步操作完成后,会调用回调函数来处理异步操作的结果。
function fun1(callback) {
setTimeout(() => {
console.log('fun1');
callback();
}, 1000);
}
function fun2() {
console.log('fun2');
}
fun1(fun2);
在上面的代码中,fun1()是一个异步操作,它会调用fun2()作为回调函数。当fun1()执行完成后,它会调用fun2()来处理异步操作的结果。
Promise
Promise是JavaScript中另一个常用的异步编程技术。Promise对象表示一个异步操作的最终完成或失败的状态。
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('fun1');
}, 1000);
});
promise.then((result) => {
console.log(result);
});
在上面的代码中,promise是一个Promise对象,它表示一个异步操作的最终完成或失败的状态。当promise对象的状态变为完成时,它会调用then()方法来处理异步操作的结果。
async/await
async/await是JavaScript中一种新的异步编程技术。它允许您使用同步的语法来编写异步代码。
async function fun1() {
const result = await new Promise((resolve, reject) => {
setTimeout(() => {
resolve('fun1');
}, 1000);
});
console.log(result);
}
fun1();
在上面的代码中,fun1()是一个异步函数,它使用await来等待promise对象的状态变为完成。当promise对象的状态变为完成时,它会继续执行后面的代码。
并发关系的实现
并发关系通常使用并行编程技术,如多线程或多进程来实现。
多线程
多线程是并行编程的一种实现方式。它允许一个程序同时执行多个任务。
const worker = new Worker('worker.js');
worker.postMessage('fun1');
worker.addEventListener('message', (event) => {
console.log(event.data);
});
在上面的代码中,worker是一个Web Worker对象,它可以独立于主线程执行任务。当主线程调用worker.postMessage()方法时,它会向worker发送一个消息。worker接收到消息后,它会执行相应的任务。当worker执行完任务后,它会向主线程发送一个消息。
多进程
多进程是并行编程的另一种实现方式。它允许一个程序同时执行多个进程。
const child_process = require('child_process');
const child = child_process.fork('child.js');
child.send('fun1');
child.on('message', (message) => {
console.log(message);
});
在上面的代码中,child是一个子进程对象,它可以独立于主进程执行任务。当主进程调用child.send()方法时,它会向子进程发送一个消息。子进程接收到消息后,它会执行相应