1

J'essaye de construire un serveur de synchronisation de barrière très simple, où le serveur est initialement alimenté par un certain nombre de processus qui communiqueront avec lui. Quand un processus est terminé, il reçoit un message avec ce processus 'Pid', et il conserve une liste de tous les processus pour le faire. Lorsque la barrière atteint zéro (tous les processus ont envoyé des messages), mon serveur doit envoyer un message à chacun d'eux (j'utilise [Pid | ProcList] comme ma liste de pids).Dans Erlang, passer un message à tous les éléments d'une liste de pids

J'ai essayé d'utiliser une fonction d'aide en vain, la liste compréhensions me garder dans une boucle infinie, et en tant que tel, je suis à la recherche sur la façon d'utiliser des listes: foreach pour prendre soin de cela. Je suis assez nouveau pour la programmation fonctionnelle, mais d'après ce que je comprends, cette foreach doit prendre dans la liste ainsi qu'une fonction lambda-calcul pour envoyer un message à chaque nœud de la liste. En raison de la nature infixe de "!", Je dois encore trouver un moyen de le faire sans provoquer d'erreurs de syntaxe. Comment avez-vous fait une boucle infinie dans la compréhension de la liste?

Répondre

4

Je dois dire que c'est assez difficile. Essayez ceci:

Message = % broadcast message goes here 
ListOfPids = % list of recipients 
[Pid ! Message || Pid <- ListOfPids]. 

Si vous souhaitez utiliser foreach, que cela prend une fonction d'argument comme premier argument, donc besoin d'envelopper send d'abord, car il est deux fonctions d'argument.

Message = % broadcast message goes here 
ListOfPids = % list of recipients 
Fun = fun (Pid) -> Pid ! Message end, 
lists:foreach(Fun, ListOfPids). 
+0

Merci beaucoup pour votre aide! Et j'ai réalisé que je l'avais reformulé en arrière; mes fonctions d'aide m'a gardé dans une boucle infinie et moi avons essayé la liste compréhensibilité sans résultat ... L'extrait de code que j'ai qu'il gèle sur est en ce moment comme suit: \t \t \t \t \t \t \t \t message = {self(), continuer}, \t \t \t \t \t \t \t \t io: Format ("obtenu ici 1"), \t \t \t \t \t \t \t \t [X! Message || X <- Pids], io: format ("obtenu ici 2"); Gel entre 1 et 2 ... Je suppose que cela signifie que c'est un problème avec les processus avec lesquels je communique. Merci encore pour votre aide! – JBarnett

+2

@JBarnett Je ne peux pas vous aider. Vous m'avez montré juste un petit fragment de votre code et je ne peux pas dire pourquoi cela ne fonctionne pas. Il n'y a aucun moyen de geler ici, car il s'agit juste d'envoyer des messages. Si votre code est court, modifiez votre question. EDIT: Y a-t-il une erreur? Si Pids n'est pas une liste ou X n'est pas pid alors cela devrait planter ... surveillez-vous ces processus d'une façon ou d'une autre? Si vous connaissez son pid, essayez is_process_alive (ItsPid). –