簡體   English   中英

如何在Node.js中編寫非阻塞代碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM