35 votes

Multi-cœur et simultanéité - Langages, bibliothèques et techniques de développement

Le PROCESSEUR de l'architecture de paysage a changé, plusieurs cœurs est une tendance qui va changer la façon dont nous avons à développer des logiciels. J'ai fait des multi-thread développement en C, C++ et Java, j'ai fait des multi-processus de développement à l'aide de divers mécanismes IPC. Les approches traditionnelles de l'utilisation de threads ne semblent pas, il est facile, pour le développeur, d'utiliser le matériel qui supporte un haut degré de simultanéité.

Quelles sont les langues, les bibliothèques et les techniques de développement, êtes-vous conscient de qui aident à atténuer les défis traditionnels de la création d'applications simultanées? Je suis évidemment penser à des questions comme les blocages et des conditions de course. Les techniques de conception, de bibliothèques, d'outils, etc. sont également intéressants qui aident réellement en profiter et de s'assurer que les ressources disponibles sont utilisées - le simple fait d'écrire un coffre-fort, robuste filetée application ne garantit pas que c'est à l'aide de tous les cœurs disponibles.

Ce que j'ai vu jusqu'à présent est:

  • Erlang: processus de base, la transmission de message de la CIB, l'acteur du modèle de la simultanéité
  • Dramatis: les acteurs du modèle de la bibliothèque pour Ruby et Python
  • Scala: langage de programmation fonctionnel pour la JVM avec certaines ajouté la simultanéité de soutien
  • Clojure: langage de programmation fonctionnel pour la JVM avec un des acteurs de la bibliothèque
  • Termites: un port d'Erlang l'approche processus et la transmission de message de Régime

Que faites-vous connaître, ce qui a fonctionné pour vous et que pensez-vous est intéressant à regarder?

11voto

Nowhere man Points 2762

Je vous suggère de deux changements de paradigme:

Logiciel De La Mémoire Transactionnelle

Vous pouvez prendre un coup d'oeil à la notion de Logiciels de la Mémoire Transactionnelle (STM). L'idée est d'utiliser l'accès concurrentiel optimiste: toute opération qui s'exécute en parallèle à d'autres d'essayer de terminer son travail dans un isolé transaction; si à un certain moment, une autre opération a été commis qui invalide les données sur lesquelles cette opération est de travail, la transaction est le travail avaient envoyé à l'écart et de la transaction de fonctionner à nouveau.

Je pense que le plus largement connu de la mise en œuvre de l'idée (si ce n'est la preuve-de-concept et premier) est le seul en Haskell : les Documents et présentations à propos de la mémoire transactionnelle en Haskell. De nombreuses autres implémentations sont répertoriés sur la page Wikipedia de la STM article.

Boucle d'événement et de promesses

Une autre façon de composer avec la concurrence d'accès est mis en œuvre dans le E langage de programmation.

Notez que sa façon de traiter les problèmes de concurrence, ainsi que d'autres parties de la langue de conception, est fortement basée sur le modèle de l'Acteur.

9voto

Steve K Points 10475

Vous avez mentionné Java, mais vous ne mentionnez que les threads. Avez-vous regardé Java simultanées de la bibliothèque? Il est livré avec Java 5 et au-dessus.

C'est une très belle bibliothèque contenant ThreadPools, CopyOnWriteCollections pour en nommer quelques-uns. Consultez la documentation du Tutoriel Java. Ou si vous préférez, la Java docs.

7voto

6voto

Torsten Marek Points 27554

J'ai utilisé le traitement de Python. Il mimicks l'API de l' enfilage du module et est donc très facile à utiliser.

Si vous arrive d'utiliser map/imap ou d'un générateur/compréhension de liste, de la conversion de votre code pour utiliser processing est simple:

def do_something(x):
    return x**(x*x)

results = [do_something(n) for n in range(10000)]

peut être parallélisée avec

import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))

qui utilisera cependant, de nombreux processeurs, vous avez pour calculer les résultats. Il y a aussi des paresseux (Pool.imap) et asynchrone variantes (Pool.map_async).

Il y a une file d'attente de la classe qui implémente Queue.Queue, et les travailleurs qui sont semblables à des fils.

Pièges

processing est basé sur fork(), qui doit être émulé sur Windows. Les objets sont transférés via pickle/unpickle, de sorte que vous avez à faire en sorte que cela fonctionne. Bifurquer un processus qui a acquis les ressources déjà pourrait ne pas être ce que vous voulez (pensez connexions de base de données), mais en général, il fonctionne. Il fonctionne tellement bien qu'il a été ajouté à la version 2.6 de Python sur la voie rapide (cf. PEP-317).

4voto

Pat Notz Points 46841

Intel Threading Building Blocks pour le C++ a l'air très intéressant pour moi. Il offre un niveau beaucoup plus élevé d'abstraction que raw threads. O'Reilly est un très beau livre si vous aimez les arbres morts de la documentation. Voir, également, des expériences avec d'Intel Threading Building Blocks?.

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