Подтвердить что ты не робот

Как написать неблокирующий код в Node.js?

Я могу написать неблокирующий I/O в Node.js очень легко. Это то, для чего настроена вся библиотека.

Но любые сделанные вычисления блокируют. Любое сообщение, проходящее через блокирует события.

Например, излучающие события немедленно устраняются и блокируются таким образом:

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, как сделать код неблокирующим?

Я хочу сделать как можно меньше вычислений за цикл цикла событий, чтобы я мог обслуживать как можно больше клиентов.

Как написать мой код неблокирующим способом?

И когда у меня есть неблокирующий код, как мне масштабировать его для нескольких процессов?

Один параметр ожидает завершения API-интерфейса суб-процесса WebWorker.

4b9b3361

Ответ 1

JavaScript является однопоточным. Это означает, что независимо от событий, тайм-аутов или задержки с помощью nextTick любое вычисление блокирует весь процесс.

Если вы разделите свою обработку шагами с помощью process.nextTick, как это было сделано с помощью setTimeout(fn, 0) на стороне клиента, чтобы избежать блокировки пользовательского интерфейса, вы могли бы увеличить свою рабочую нагрузку на более длительный промежуток времени, предоставляя некоторое пространство для других функций для запуска.

Но это очень неэффективное решение - общий объем работы одинаковый, распределенный между всеми циклами (делая каждый запрос немного медленнее). На практике любой вид вычислений, который, как ожидается, займет больше нескольких миллисекунд, должен быть выгружен в другой процесс. Чтобы максимизировать concurrency, вы всегда должны как можно быстрее возвращаться к циклу событий.

child_process.fork() был добавлен в v0.5 несколько дней назад. Это упрощает создание и передачу дочерних процессов - не совсем API веб-рабочих, но близко, см. URL https://github.com/joyent/node/blob/master/doc/api/child_process.markdown.

Ответ 2

В JavaScript нет реальной многопоточности и что вам нужно сделать неблокирующий вызов. Единственное, о чем я могу думать, это веб-рабочие: https://developer.mozilla.org/en/Using_web_workers