54 votes

La simultanéité modèle: Erlang vs Clojure

Nous allons écrire un programme concurrent à l'aide de Clojure, qui va extraire des mots-clés à partir d'un grand nombre de messages entrants qui seront recoupées avec une base de données.

L'un de mes coéquipiers a suggéré d'utiliser Erlang pour écrire ce programme.

Ici, je tiens à souligner quelque chose que je suis de nouveau à la programmation fonctionnelle, donc je suis dans un petit doute si clojure est un bon choix pour l'écriture de ce programme, ou Erlang est plus approprié.

62voto

mikera Points 63056

Pensez-vous vraiment dire parallèles ou distribuées?

Si vous voulez dire simultanées (multi-thread, multi-core, etc.), je dirais ensuite que Clojure est la solution naturelle.

  • Clojure de la STM modèle est parfaitement conçu pour le multi-core de la simultanéité, car il est très efficace pour le stockage et la gestion de l'état partagé entre les threads. Si vous voulez comprendre plus qu'il vaut la peine de regarder cette excellente vidéo.
  • Clojure STM sûre mutation de données par threads simultanés. Erlang laisse de côté ce problème en rendant le tout immuable, ce qui est bien en soi, mais cela n'aide pas quand vous avez réellement besoin partagé mutable état. Si vous souhaitez partager mutable état en Erlang, vous avez à mettre en œuvre avec un ensemble de message d'interactions qui n'est ni efficace, ni pratique (c'est le prix d'un rien partagé modèle....)
  • Vous obtiendrez intrinsèquement meilleure performance avec Clojure si vous êtes dans un tel cadre dans une grosse machine, depuis Clojure ne repose pas sur la transmission de messages et donc la communication entre les threads peuvent être beaucoup plus efficace.

Si tu parles de la distribution (c'est à dire de nombreuses machines de partage sur un réseau qui sont effectivement en cours d'exécution en tant que processus isolés), alors je dirais Erlang est la solution la plus logique:

  • Erlang est immuable, rien partagé, de la transmission de message style vous oblige à écrire le code peut être distribué. Donc idiomatiques Erlang automatiquement peuvent être distribués sur plusieurs machines et de les exécuter dans un système distribué, à tolérance de pannes de réglage.
  • Erlang est donc très bien optimisé pour ce cas d'utilisation, donc être le choix naturel et serait certainement le moyen le plus rapide pour obtenir de travail.
  • Clojure pourrait faire aussi bien, mais vous aurez besoin de faire beaucoup plus de travail vous-même (c'est à dire que vous auriez besoin pour mettre en œuvre ou choisir une certaine forme de calcul distribué cadre) - Clojure ne dispose pas actuellement de venir avec un tel cadre par défaut.

Dans le long terme, j'espère que Clojure développe une informatique distribuée cadre qui correspond à Erlang - alors vous pouvez avoir le meilleur des deux mondes!

48voto

nimrodm Points 9191

Les deux langues et exécutions prendre différentes approches de la concurrence:

  • Erlang structures de programmes, comme de nombreux processus légers de la communication entre l'un de l'autre. Dans ce cas, vous aurez probablement un processus maître de l'envoi des emplois et des données à de nombreux travailleurs et de plus les processus pour gérer les données qui en résultent.

  • Clojure favorise une conception où plusieurs threads de partager des données et de l'état en utilisant les structures de données communes. Il semble particulièrement adapté pour les cas où le nombre de threads ont accès aux mêmes données (en lecture seule) et de partager peu mutable état.

Vous avez besoin d'analyser votre demande de déterminer le modèle qui vous convient le mieux. Cela peut également dépendre de l'utilisation d'outils externes que vous utilisez (par exemple, la capacité de la base de données pour gérer les demandes simultanées.

Un autre aspect est que clojure tourne sur la JVM, où de nombreuses bibliothèques open source sont disponibles.

8voto

duffymo Points 188155

Clojure est Lisp en cours d'exécution sur le Java JVM. Erlang est conçu à partir du sol pour être très à tolérance de pannes simultanées.

Je crois que la tâche est faisable avec l'une de ces langues et de nombreux autres. Votre expérience dépendra de la façon dont vous comprenez le problème et comment bien vous savez la langue. Si vous êtes nouveau à la fois, je dirais que le problème sera difficile, peu importe celle que vous choisissez.

Avez-vous pensé à quelque chose comme Lucene/Solr? C'est un excellent logiciel pour l'indexation et la recherche de documents. Je ne sais pas ce que "la contre-vérification" désigne, pour votre contexte, mais ce pourrait être une bonne solution à envisager.

0voto

Fortyrunner Points 8072

Mon approche serait d'écrire un test simple dans chaque langue et de tester la performance de chacun. Les deux langues sont quelque peu différents de style C langues et si vous n'êtes pas habituer (et vous n'avez pas une équipe qui est utilisé pour eux) vous pouvez vous retrouver avec un entretien cauchemar.

Je voudrais aussi regarder en utilisant quelque chose comme Groovy 1.8. Groovy comprend maintenant GPars pour permettre le calcul parallèle. Chaîne et de manipulation de fichiers en Groovy est très facile en effet.

-4voto

user425720 Points 2419
  1. Cela dépend de ce que tu veux dire par d'énormes.
  2. Les chaînes en erlang sont douloureuses..

mais:

Si d'énormes moyens des dizaines de machines réparties, que d'aller avec erlang et écrire des travailleurs dans le texte convivial langages (python?, perl?). Vous aurez distribué couche sur le dessus avec très concurrente des travailleurs locaux. Chaque travailleur devrait être représenté par erlang processus. Si vous avez besoin de plus de performance, de réécrire votre travailleur en C. En Erlang c'est super facile de parler d'autres langues.

Si d'énormes signifie toujours une forte machine aller à la JVM. Ce n'est pas énorme alors.

Si grand est des centaines de machines, je pense que vous aurez besoin de quelque chose de plus fort, comme sur google (bigtable, map/reduce) probablement sur le C++ de la pile. Erlang encore OK, cependant, vous aurez besoin de bons devs de ce code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X