Ответ 1
Здесь вы должны различать две вещи:
- Синхронные функции, такие как node
fs.readFileSync
,fs.statSync
и т.д. Все эти функции имеютSync
в своих именах (*). Эти функции действительно синхронны и блокируются. Если вы их вызываете, вы блокируете цикл событий, и вы убиваете производительность node. Эти функции следует использовать только при инициализации сервера script (или в сценариях командной строки). - Библиотеки и инструменты, такие как волокна или streamline.js. Эти решения позволяют писать код в стиле синхронизации, но код, который вы пишете с ними, будет выполняться асинхронно. Они не блокируют цикл событий.
(*) require
также блокирует.
Метеор использует волокна. Его код написан в стиле синхронизации, но он не блокируется.
Победа не на стороне производительности (эти решения имеют свои собственные накладные расходы, поэтому они могут быть немного медленнее, но они также могут делать лучше, чем необработанные обратные вызовы для определенных кодовых шаблонов, таких как кеширование). Победа и причина, по которой эти решения были разработаны, относятся к юзабилити: они позволяют вам писать код в стиле синхронизации, даже если вы вызываете асинхронные функции.
25 января 2017 г.. Я создал 3-х элементов для иллюстрации неблокирующих волокон: fiber-does-not-block.js, fiber-sleep- sequential.js, fiber-sleep-parallel.js