2010-05-31 7 views
6

Comment fonctionnent les boucles de messages dans erlang, sont-elles synchronisées lorsqu'il s'agit de traiter des messages? Pour autant que je sache, la boucle commencera par "recevoir" un message, puis exécuter quelque chose et frapper une autre itération de la boucle.Boucles de messages Erlang

Donc, ça doit être synchronisé? droite?

Si plusieurs clients envoient des messages à la même boucle de messages, tous ces messages sont mis en file d'attente et exécutés l'un après l'autre, ou?

Pour traiter plusieurs messages en parallèle, vous devez générer plusieurs boucles de messages dans différents processus, n'est-ce pas? Ou ai-je mal compris tout cela?

Répondre

9

L'envoi d'un message est asynchrone. Le traitement d'un message est synchrone - un message est reçu à la fois - parce que chaque processus a sa propre boîte aux lettres (et une seule).

4

A partir du manuel (Erlang concurrency

Chaque processus a sa propre file d'attente d'entrée pour les messages qu'il reçoit. Les nouveaux messages reçus sont mis à la fin de la file d'attente. Lorsqu'un processus exécute une réception, le premier message la file d'attente est comparée au premier modèle dans la réception, si cela correspond, le message est retiré de la file d'attente et les actions correspondant au modèle sont exécutées
Cependant, si le premier motif ne correspond pas, le second motif est testé, si cela correspond, le message est retiré de la file d'attente et les actions correspondant au second modèle sont exécutées Si le second modèle ne correspond pas au le troisième est essayé et ainsi de suite jusqu'à ce qu'il n'y ait plus de modèle à tester. S'il n'y a plus de modèles à tester, le premier message est conservé dans la file d'attente et nous essayons le second message à la place. Si cela correspond à un modèle, les actions appropriées sont exécutées et le second message est supprimé de la file d'attente (en gardant le premier message et tous les autres messages dans la file d'attente). Si le deuxième message ne correspond pas, nous essayons le troisième message et ainsi de suite jusqu'à ce que nous atteignions la fin de la file d'attente. Si nous atteignons la fin de la file d'attente, le processus bloque (arrête l'exécution) et attend jusqu'à ce qu'un nouveau message soit reçu et que cette procédure soit répétée.
Bien sûr, l'implémentation d'Erlang est "intelligente" et minimise le nombre de fois que chaque message est testé par rapport aux patterns de chaque réception.

Vous pouvez donc créer des prios avec la regex, mais la concurrence est effectuée via plusieurs processus.