Concurrence de type Erlang dans le langage de programmation D
je pense que Erlang-style de simultanéité est la réponse à la croissance exponentielle du nombre de cœurs. Vous pouvez sorte de faux avec d'autres dans le courant principal de langues. Mais les solutions de toujours me laisser à désirer. Je ne suis pas prêt à abandonner multi-paradigmes de programmation (C++/D) pour passer en Erlang est draconienne de la syntaxe.
qu'est-Ce que Erlang-style de simultanéité:
à Partir de l'un des auteurs de langue( qu'est-Ce que Erlang simultanéité de modèle ? ):
- lightweight competiency.
Pas cher pour créer des fils et pas cher pour maintenir des nombres insensés. - communication asynchrone.
Les Threads ne communiquent que via des messages. - traitement des erreurs.
- Processus d'isolement.
Ou à partir d'un informés de blogger ( qu'est-Ce que Erlang-Style de Simultanéité? ):
- Fast processus de création/destruction
- capacité de supporter > > 10 000 processus concurrents dont les caractéristiques sont en grande partie inchangées.
- Fast asynchrone de passage de messages.
- Copie de passage de message sémantique (part-rien de simultanéité).
- Processus de surveillance.
- réception sélective de messages.
je pense D de la transmission de message peut accomplir la plupart de ces fonctionnalités. Ceux que je me demande à propos de >>10,000 simultanée des processus(les threads) " et " fast processus de création/destruction ".
Comment en est-poignée en D à ces exigences?
je pense que, pour les soutenir correctement, vous devez utiliser le fils verts . Peut D de la transmission de message dispose d'être utilisé avec fils verts de la bibliothèque?
3 réponses
stockage est thread-local par défaut en D, donc rien n'est partagé entre les threads à moins qu'il ne soit spécifiquement marqué comme shared
. Si vous marquez une variable comme shared
, vous pouvez alors utiliser les mutex et les conditions ainsi que des objets synchronisés pour faire face à la concurrence. Toutefois, le moyen préféré de communiquer entre les fils est d'utiliser les fonctions de transmission de messages dans la norme std.simultanéité et laisser toutes les données rester thread-local, en utilisant seulement shared
quand vous devez. Tous les objets passés entre les threads à l'aide de la norme std.la concurrence doit soit être transmise par la valeur, soit Être immuable, de sorte qu'il n'y a pas de partage et que le fil est complètement sûr. Cependant, il peut être actuellement un peu difficile d'obtenir un type de référence immuable qui n'est pas un tableau ( idup
rend généralement facile pour les tableaux), de sorte qu'il peut être un peu ennuyeux de passer n'importe quoi d'autre que les types de valeur ou tableaux (bien que j'espère que la situation s'améliore dès que le compilateur et les bogues de bibliothèque standard concernant const et immuable se fixe et plus code const-correct).
maintenant, alors que le passage de message en D se traduira certainement par du code plus propre et plus sûr que ce que vous obtiendriez dans des langages comme C++ ou Java, il est construit sur le dessus de la normale, c threads (par exemple Linux utilise pthreads), donc il n'a pas le genre de threads légers que fait Erlang, et donc traiter avec plusieurs threads ne va pas être aussi efficace que Erlang.
bien sûr, je ne vois pas pourquoi un système de thread plus efficace ne pourrait pas être écrit en utilisant D, à ce moment-là vous pourriez être en mesure d'obtenir une efficacité de thread similaire à celle D'Erlang, et il pourrait probablement utiliser une API similaire à celle de std.la concurrence, mais tous les threads standards de D sont construits sur les threads normaux, C, donc vous devez faire tout cela vous-même, et en fonction de la façon dont vous l'avez implémenté et en fonction de la façon dont exactement le thread-local / shared
est traité par le compilateur et druntime, il pourrait être difficile d'obtenir le système de type pour imposer que tout soit thread-local avec vos threads "verts". Je crains de ne pas savoir exactement comment shared
est mis en œuvre ou comment les fils" verts " fonctionnent pour en être sûr.
quoi Qu'il en soit, le système de transmission de messages de D aura certainement pour résultat de traiter avec des threads plus agréables que C++ ou même Java, mais il n'est pas conçu pour être simplifié de la même manière que Erlang est. D est un langage de systèmes à usage général, pas un langage spécifiquement conçu pour utiliser des threads pour tout et donc de les utiliser absolument aussi efficacement que possible. Une grande partie des installations standard de D sont construites au-dessus de C, de sorte qu'une grande partie de ses caractéristiques d'efficacité seront similaires à celles de C.
cette fonctionnalité est fréquemment utilisée en combinaison avec async I/O pour communiquer efficacement avec des sources externes de données ainsi. L'ambiance .d framework semble offrir à la fois le modèle de threading multi-fibres-on-a-few-OS-threads et les bibliothèques async I/O (en plus d'un ensemble de bibliothèques d'applications web et d'outils de gestion de projet).
comme une note secondaire sans rapport, c'est assez cool que D soit à la fois assez bas niveau que vous pourriez écrire ce cadre en TI et de haut niveau assez pour être un langage convaincant pour écrire vos applications web sur le dessus du cadre. Autres langues populaires avec des cadres similaires (noeud.js, EventMachine de Ruby, coroutines en Python et Go) sont incapables de rivaliser avec D sur les systèmes de codage de bas niveau. D'autres langages populaires avec des installations de programmation de systèmes similaires (C, C++) ne peuvent pas rivaliser sur le codage d'application de haut niveau.
je suis nouveau à D, mais je dois dire, je aime ce que je vois.
d'après ce que je sais de D: son infrastructure de transmission de messages est construite sur ses installations de filetage. Si la bibliothèque core threading est un wrapper sur les threads OS, il y a peu de chances que la simultanéité en D atteigne la magnitude (>> 10000) D'Erlang. De plus, D n'impose pas l'immutabilité sur les objets, il est donc facile de tout gâcher. Donc, Erlang est le meilleur choix pour la concurrence lourde. Probablement vous pouvez écrire les trucs de concurrence dans Erlang et le reste du projet dans D. Still, il est possible d'avoir des fils verts efficaces dans les langages C comme (C++, D etc) - jeter un oeil à Protothreads et ZeroMQ . Vous pouvez mettre en œuvre des cadres de messagerie très efficaces en utilisant ceux-ci, et les appeler via un c shim ou directement à partir de D .