在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中文網其他相關文章!