在 Node.js 中编写非阻塞函数的正确方法
非阻塞范式对于 Node.js 中的实现至关重要高性能。然而,编写真正不阻碍事件循环进程的非阻塞函数可能具有挑战性。
理解非阻塞行为
将代码包装在 Promise 中本质上并不使其成为非阻塞。 Promise 执行器函数是同步执行的,这意味着其中长时间运行的代码将阻塞其他操作的执行。
示例:Promise-Wrapped 阻塞函数
考虑以下函数:
function longRunningFunc(val, mod) { return new Promise((resolve, reject) => { let sum = 0; for (let i = 0; i < 100000; i++) { for (let j = 0; j < val; j++) { sum += i + j % mod; } } resolve(sum); }); }
虽然此函数返回 Promise,执行器中的代码被阻塞。事件循环将等到此代码完成后再执行其他操作。
使用 setTimeout 模拟异步
在这种情况下模拟非阻塞行为的一种方法是使用setTimeout:
function longRunningFunc(val, mod) { return new Promise((resolve, reject) => { setTimeout(() => { let sum = 0; for (let i = 0; i < 100000; i++) { for (let j = 0; j < val; j++) { sum += i + j % mod; } } resolve(sum); }, 10); }); }
此代码安排长时间运行的循环在10 毫秒延迟。但是,它在延迟执行期间仍然会阻塞。
真正的非阻塞方法
要创建真正的非阻塞函数,您需要使用移动代码的技术在 Node.js 主线程之外执行:
以上是如何在 Node.js 中编写真正的非阻塞函数?的详细内容。更多信息请关注PHP中文网其他相关文章!