2012-08-27 4 views
18

Не кодирует ли эффективность хит, будучи синхронным? Почему синхронно кодируется выигрыш? Я нашел эти две ссылки в этом некоторые исследования: http://bjouhier.wordpress.com/2012/03/11/fibers-and-threads-in-node-js-what-for/, https://github.com/Sage/streamlinejs/Почему meteor.js синхронно?

Если цель состоит в том, чтобы предотвратить код спагетти, то ясно, что вы можете иметь асинхронный код, с streamline.js, например, это не обратный вызов пирамиды, правильно?

ответ

33

Вы должны различать две вещи здесь:

  • Синхронные функции как узла fs.readFileSync, fs.statSync и т.д. Все эти функции имеют в своем названии в Sync (*). Эти функции действительно синхронно и блокировка. Если вы их вызываете, вы блокируете цикл событий и убиваете производительность узла. Эти функции следует использовать только в сценарии инициализации сервера (или в сценариях командной строки).
  • Библиотеки и инструменты, такие как волокна или streamline.js. Эти решения позволяют вам писать код в sync-style, но код, который вы пишете с ними, по-прежнему будет выполнять асинхронно. Они делают не блокируют цикл событий.

(*) require также блокируется.

Метеор использует волокна. Его код написан в стиле синхронизации, но он не блокирует.

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

25 Jan 2017 редактировать: Я создал 3 г для иллюстрации неблокирующих волокон: fibers-does-not-block.js, fibers-sleep-sequential.js, fibers-sleep-parallel.js

+0

"Они не блокируют цикл событий." Заявление вводит в заблуждение, поскольку волокна должны блокировать цикл событий в критических разделах. Разработчик должен решить, какие критические разделы и использовать волокна соответствующим образом. – ashim

+0

@ashim. Это неправильно: волокна не имеют превентивного характера; контекстные переключатели между волокнами реализованы libcoro и полностью отделены от цикла событий. –

+0

Я смущен. Если я делаю операции ввода/вывода внутри волокна, между командами fiber.run() fiber.yield(), остальная часть программы будет ждать, пока этот раздел кода не будет выполнен. Как он не блокирует? Я что-то не понимаю? – ashim

3

Код не является «синхронным» при использовании чего-то вроде streamlinejs. Фактический код будет все еще работает асинхронно. Не очень красиво писать много анонимных функций обратного вызова, вот почему это помогает.

Смежные вопросы