Асинхронность, многопоточность, node.js и Ruby on Rails - PullRequest
0 голосов
/ 25 июня 2011

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

Да.

Существует две возможности выполнения асинхронного, но обязательного программирования

Использование реального асинхронного языка:

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

Использование компилятора

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

Один из примеров: storm

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

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

0 голосов
/ 28 июня 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...