[英]How do I write non-blocking code in Node.js?
我可以很容易地在Node.js中編寫非阻塞I / O. 這就是整個庫的設置。
但任何完成的計算都是阻塞的。 通過事件發射器傳遞的任何消息都是阻塞的 。
例如,發射事件立即解決,因此阻塞:
var e = new process.EventEmitter;
e.on("foo", function() {
console.log("event");
});
process.nextTick(function() {
console.log("next tick");
});
setTimeout(function() {
console.log("timeout");
}, 0);
e.emit("foo");
> event
> next tick
> timeout
除了在nextTick
包裝調用nextTick
,如何使代碼無阻塞?
我希望盡可能少地在事件循環的每個周期進行計算,這樣我就可以同時為多個客戶端提供服務。
如何以非阻塞方式編寫代碼?
當我有非阻塞代碼時,如何在多個進程中進行擴展?
一種選擇是等待WebWorker子流程API完成。
JavaScript是單線程的。 這意味着無論事件,超時或延遲使用nextTick,任何完成的計算都將阻止整個過程。
如果您使用process.nextTick
分步process.nextTick
,就像在客戶端使用setTimeout(fn, 0)
,以避免阻止UI,您可以在更長的時間跨度上分散工作負載,為其他功能提供一些空間跑步。
但這是一個非常無用的解決方案 - 總工作量是相同的,分布在所有周期中(使每個請求稍慢)。 在實踐中,任何預計需要花費超過幾毫秒的計算都應該卸載到不同的進程中。 要最大化並發性,應始終盡快返回事件循環 。
child_process.fork()
被添加到v0.5。 它簡化了子進程的創建和通信 - 不僅僅是Web worker API,而是關閉,請參閱URL https://github.com/joyent/node/blob/master/doc/api/child_process.markdown 。
JavaScript中沒有真正的多線程,這就是使調用無阻塞所需要的。 我唯一能想到的是網絡工作者: https : //developer.mozilla.org/en/Using_web_workers
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.