2011-06-25 4 views
0

Помимо использования другого языка сценариев, кажется, что главная привлекательность node.js - это поддержка программирования, управляемого событиями, что упрощает запись масштабируемых серверов (или другие типичные приложения, связанные с I/O) из-за его упрощенных неблокирующих вызовов ввода-вывода. Однако эта функция возникает из-за необходимости изучать новую модель программирования, которая по существу требует, чтобы вы проходили обратный вызов после функции обратного вызова, что делало некоторые простые задачи (например, зависимые последовательности действий) несколько более сложными.Asynchronicity, threading, node.js и Ruby on Rails

Контраст этой модели программирования на традиционную версию Ruby on Rails, которая блокирует все операции ввода-вывода и (эффективно) однопоточную (из-за реализации зеленых потоков MRI).

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

Возможно ли такое время выполнения (или переводчик времени выполнения)? Существуют ли веб-фреймворки, которые уже что-то делают?

+0

Илья Григорик проделал определенную работу с рубиновыми волокнами, EventMachine и рельсами. Взгляните на это (особенно ссылки внизу): https: // github.com/igrigorik/async-rails – igorw

+0

@igorw: это очень похоже на то, о чем я думал, пожалуйста, разместите его как ответ, чтобы я мог повышать! – maerics

+0

Создание асинхронных рельсов кажется мне взломанным. Это вызывающе выглядит как абстракция, которая будет сильно просачиваться. – Raynos

ответ

0

Благодаря проекту @igorw, проект async-rails - это то, что я представлял.

Но, поскольку @Raynos и @apneadiving указывают, существуют потенциально лучшие решения, такие как Ruby EventMachine и stormjs.

2

Да.

Есть две возможности для ведения асинхронного но императивного программирования

Используйте реальный асинхронный язык:

Erlang будет примером, где вы можете написать необходимо сделать это, сделать это код, и это приводит к асинхронный. Я не думаю, что все идет полным ходом.

Используй компилятором

Вы можете использовать компилятор, который преобразует блокирующий код стиля в неблокирующий код. Я лично высоко рекомендую против этого, потому что это черный ящик и кошмар для отладки.

Одним из примеров может быть storm

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

Я тем не менее рекомендую вам укусить пулю и сделать переключатель парадигмы. Это будет намного лучше инвестировать в долгосрочную перспективу. Имейте в виду, что не обязательно использовать node.js, есть сильные альтернативы, такие как erlang и haskell.