59 votes

Quel langage de programmation rend la programmation simultanée aussi simple que possible?

Si vous souhaitez créer des programmes avec des threads / processus qui s'exécutent en parallèle, vous devez en savoir plus sur de nombreux éléments, tels que les conditions de concurrence, les verrous, les sémaphores, les moniteurs, les blocages, etc.

Existe-t-il un langage qui facilite la création de programmes parallèles, un langage de programmation orienté objet aidant à la création d'architectures complexes? Ou quels langages de programmation ont les concepts les meilleurs et les plus simples pour vous aider dans cette tâche?

74voto

Alex Miller Points 28225

61voto

Martin Beckett Points 60406

Tout langage fonctionnel - Erlang est probablement le plus couramment utilisé dans l'industrie. En particulier dans le secteur des télécoms.

L'avantage d'un langage fonctionnel est qu'un appel de fonction ne change jamais de données, il retourne uniquement les nouvelles données. Donc, il n'y a pas de problème de verrouillage/sémaphores/etc pour empêcher les deux fonctions d'accès aux mêmes informations en même temps.

Il y a une très bonne introduction du livre de pragmatique, mais en faisant le cerveau de passer à la programmation fonctionnelle n'est pas nécessairement facile

Programaming Erlang cover

Il y a un google tech talk sur Erlang, qui comprend la citation. "dans le teleconms de l'industrie - temps d'arrêt de 1 ou 2 secondes d'un an sont tout simplement pas acceptable"!

61voto

mikera Points 63056

Clojure est peut-être le plus intéressant de la langue moderne à partir d'un point de vue de la simultanéité. C'est un langage fonctionnel qui prend en charge une variété de différentes techniques de concurrence, y compris:

  • Facile filetée de la simultanéité des capacités sur le filetage des capacités de la machine, mais avec un style fonctionnel
  • Logiciel de transaction de la mémoire pour les mises à jour simultanées d'un état partagé
  • Canal-fonction de simultanéité similaire à l' Go langue avec le cœur.async bibliothèque

Facile filetée de la simultanéité

futures sont utilisés pour déléguer des tâches à d'autres threads.

;; Create and launch a future
(def fut (future (do (Thread/sleep 1000) "Finished!"))))

;; do other stuff while the future does its work

;; Now get the result of the future (waiting for it to complete if needed)
@fut
=> "Finished!"

Logiciel De Transaction De La Mémoire

Une clé de simultanéité fonctionnalité est puissant STM (logiciel de la mémoire transactionnelle) modèle sans verrouillage de la simultanéité. Cette vidéo sur Clojure de simultanéité est vraiment la peine de prendre un coup d'oeil - il m'a convaincu que Clojure offert quelque chose de véritablement nouveau et spécial.

Comme un avant-goût, voici quelques Clojure de code qui montre comment il est facile d'écrire de façon sûre, fiable, simultanées, transactionnelle code sans verrous à l'aide de la STM sysyem:

;; define two accounts that we want to transfer money between:

(def account-a (ref 1000000))
(def account-b (ref 0))

;; launch 10000 tasks to transfer a random amount of money
;; each of which can happens on a different thread or core
;; each takes place inside a (dosync ....) transaction

(dotimes [i 10000] 
  (future 
    (let [transfer (rand-int 10)]
      (dosync
        (alter account-a - transfer)
        (alter account-b + transfer)))))

;; a transactional read of the two accounts should then 
;; always have the same total amount, at any point in time
;; (even while the above operation is still running)

(dosync 
  (+ @account-a @account-b))

=> 1000000

Chaîne En Fonction De La Simultanéité

Cela appuie la "Communication sur les Processus Séquentiels" style de développement, qui a vu récente de l'importance comme une caractéristique fondamentale de l' Go langage de programmation.

Voici un exemple à partir d'un core.async exemple qui déclenche simultanément plusieurs requêtes web, compile les résultats et s'applique également timeout logique:

;; get the fastest result from a series of replica queries
(defn fastest [query & replicas]
  (let [c (chan)]
    (doseq [replica replicas]
      (replica c query))
    c))

(defn google [query]
  (let [c (chan)
        t (timeout 80)]
    (future (>!! c (<!! (fastest query web1 web2))))
    (future (>!! c (<!! (fastest query image1 image2))))
    (future (>!! c (<!! (fastest query video1 video2))))
    (loop [i 0 ret []]
      (if (= i 3)
        ret
        (recur (inc i) (conj ret (alt!! [c t] ([v] v))))))))

C'est complètement asynchrone (pas les threads sont bloqués!) - de sorte que vous pouvez avoir en toute sécurité des milliers de semblables opérations qui s'exécutent simultanément tout en consommant un minimum de ressources système.

33voto

artificialidiot Points 3584

Résumé pour les impatients: Connaître les principes de base de la programmation fonctionnelle. Le reste provient relativement facile quel que soit votre choix de langue.

En principe, vous pouvez même utiliser C/C++ pour la programmation simultanée aussi facilement que les langages fonctionnels, si vous suivez les conventions de la programmation fonctionnelle . Par exemple, si vous passez un objet à une fonction et le retour d'un nouvel objet sans modifier l'original, vous avez à la fois éviter les effets secondaires, réduire la gestion de la mémoire des maux de tête et de ne pas sacrifier la flexibilité de l'inévitable hacks. Ce style donne également les compilateurs modernes beaucoup de possibilités pour optimiser objet.

Le point est, si vous savez comment appliquer ces principes, le choix de la langue devient moins important.

12voto

nponeccop Points 8111

Erlang est probablement le meilleur intégrer la façon de faire de la simultanéité à cause de la lenteur (voir shootout) de la machine virtuelle, mais avec très peu de frais généraux par fil et un bon fil d'isolement (vous ne pouvez pas muter des données qui ne sont pas locaux à enfiler et pouvez arrêter et redémarrer fils très facilement).

Mais il y a des TONNES de non-mainstream de recherche et de langues spécifiquement conçus pour traiter la simultanéité beaucoup mieux qu'un inculte esprit peut imaginer.

Certaines de ces langues sont devenus matures et prêtes à la production (par exemple, GHC mise en œuvre de Haskell), mais ils ont généralement besoin d'un Doctorat en mathématiques et/ou informatique pour écrire de gros programmes et n'est donc pas très utile pour les commerciaux d'applications en raison de leur courbe d'apprentissage.

Haskell soutien à la simultanéité comprend:

  • La lumière-poids natif (par opposition à interpréter) de threads ("sparks")
  • Logiciel de transaction de la mémoire
  • Parallèle des données Haskell (DPH) bibliothèque
  • La communication Haskell Processus (CHP) de la bibliothèque
  • beaucoup plus (MVar, à terme, de la paresse, de la fonctionnelle de la pureté, etc)

Si vous voulez apprendre l'état actuel de l'art, je vous suggère d'aller à CiteSeerX ou similaire catalogues de la recherche scientifique des publications et de la lecture sur Pi-Calcul et calculs liés statiquement sûr de simultanéité et paralellism. Il y a littéralement des milliers de personnes.

Un exemple de cette publication est de Communiquer des Processus Séquentiels par Tony Hoare. La COGÉNÉRATION est un Haskell mise en œuvre de ces idées.

En général, il y a différents grades de la simultanéité de soutien:

  • Dominantes (par exemple, Java, C#)
  • Avancé mainstream (Erlang, Node.js, Clojure, Allez)
  • Mature recherche langues et des bibliothèques (Haskell, Mozart/Oz, ATS)
  • Pourtant, mis en oeuvre des idées ou des idées avec un buggy et unoptimized implémentations (littérature scientifique et expérimentale de la preuve de concept compilateurs, par exemple "Concurrent Objets dans un Processus de Calcul (1995)" par Pierce)

Donc, pour vous donner une meilleure réponse, c'est bon à savoir pourquoi vous avez besoin d'une avancée de la langue à des fins de simultanéité. E. g. êtes-vous l'écriture d'une thèse, de faire un passe-temps de la recherche ou de la création d'un logiciel commercial du produit?

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