Список четных / асинхронных языков - PullRequest
10 голосов
/ 05 марта 2010

Я работаю в системе, которая должна быть достаточно масштабируемой с самого начала. Я начал смотреть / играть с асинхронными / четными подходами к написанию серверного кода. Я поиграл как с EventMachine ruby, так и с node.js.

EventMachine - это круто, но у меня нет асинхронного файлового ввода-вывода, который мне нужен. Интерфейс тоже немного странный.

Node.js потрясающий, но это ... э-э ... это javascript.

Может ли большое сообщество Stack Overflow помочь мне, перечислив другие языки, которые имеют сильную асинхронную поддержку? Чтобы соответствовать требованиям, язык должен поддерживать оба замыкания и иметь библиотеки для асинхронных файлов io, http и т. Д. Было бы неплохо иметь что-то вроде node.js, написанное на более сильном языке, чем javascript.

Lisp? Python закрутился, верно?

Ответы [ 4 ]

20 голосов
/ 05 марта 2010

Erlang может быть языком с самой высокой внутренней масштабируемостью для кода на стороне сервера (он управляет многопроцессорной обработкой для вас, в основном, посредством асинхронного, совместного переключения задач «под прикрытием») - если вы можете Желудок его своеобразный синтаксис и (часто) своеобразная семантика.

Python имеет витые (очень общее назначение для всех сетевых задач), торнадо (особенно для серверной асинхронной) и без стеков (широко используется в онлайн-играх MMP), не говоря уже о старом, но пригодном для использования asyncore, который есть в стандартная библиотека (и еще более старая «Медуза», которая находится на вершине асинхронного пространства, чтобы обогатить ее функциональность).

Go имеет очень легкий "стек без" goroutines и channels для целей синхронизации при необходимости.

15 голосов
/ 05 марта 2010

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

Теперь, если использование библиотек на основе событий - такая плохая вещь, то почему я рекомендую node.js? Все просто: ECMAScript не не имеет каких-либо синхронных библиотек ввода / вывода (из-за простого факта, что у него вообще нет библиотек ввода / вывода вообще ), поэтому проблема смешивания просто не возникает. (На самом деле, он имеет некоторые библиотеки ввода / вывода, такие как XmlHttpRequest или веб-сокеты, но угадайте, что: это уже все на основе событий.)

node.js сам реализует все библиотеки ввода-вывода, все они основаны на событиях, без требований обратной совместимости или устаревших требований.

В противном случае каждый язык или платформа имеет некоторые библиотеки событий или асинхронного ввода / вывода: в Ruby есть EventMachine и Rev , в .NET есть Rx , JVM имеет NIO , Unix-системы имеют kqueue / epoll, C имеет libev и libeio (поверх которого находятся node.js и Rev собраны), Perl имеет AnyEvent (построено поверх libev того же автора) и т. Д.

4 голосов
/ 07 марта 2010

Поскольку вы проявили интерес к Лиспу, вы можете рассмотреть Clojure - диалект Lisp для JVM с сильным акцентом на параллелизм . Практически все можно запустить асинхронно, запустив это в агенте . Конечно, он также обеспечивает безболезненный доступ ко всей экосистеме Java.

3 голосов
/ 05 марта 2010

F # имеет асинхронные рабочие процессы, которые являются отличным способом написания асинхронного кода.

...