2017-03-04 1 views
1

J'ai un programme simple qui quand donné un message de tupple contenant {pid, nombre entier} enverra un message au processeur avec son PID et l'interger + 1. Le problème est que j'ai besoin que ce programme reste actif pour que je puisse lui envoyer plusieurs messages, et puis quand je l'écrase(), j'enverrai sa boîte aux lettres en une seule fois. Cela ne fonctionne que 1 message à la fois. J'ai essayé une récursivité mais ça ne marche pas. Voici ce que j'ai.Comment est-ce que je fais toujours un état de processus pour elixir?

defmodule Spawner do 
    def start() do 

    spawn(fn -> 
     receive do 
     {pid,y} -> send(pid,y+1) 
     Spawner.start() 
     end 
    end) 

    end 
end 

ensuite sur le terminal que je ferais:

> x = Spawner.start() 
> send x, {self(),3} 
> send x, {self(),5} 
> flush() 
#⇒ output: {PID,4} 

J'ai besoin que la sortie soit {PID,4} et {PID,6}.

Nous vous remercions de votre temps.

Répondre

2

Pensez à send comme sur le jeu de ping-pong. La règle est: on envoie ⇒ on consomme. Exactement comme dans le ping-pong on ne peut pas s'attendre au bon comportement du côté opposé, en servant dix balles à la fois.

Pour accomplir ce que vous voulez, vous allez avoir un GenServer que recueille tous les messages reçus (au lieu immédiatement répondre à chacun d'eux.)

Il serait également fournir, par exemple, get_all appel , qui récupérerait tous les messages à partir de son collectées Etat et répondre à la {int, list} tuple:

{PID, [msg1, msg2, ..., msgN]} 

la mise en œuvre de ce ne correspondra pas aux marges, mais puisque vous avoir votre question taguée avec , GenServer tutoriel serait un bon début. Ensuite, vous voudrez peut-être lire sur Agent pour maintenir l'état.


autre sens (je ne recommande pas) serait flush() le consommateur récursive avec un délai d'attente. La file d'attente vide déclencherait un timeout. Mais, encore une fois, ce n'est pas ce qui est censé être fait, parce que vous voulez probablement que tous les messages déjà envoyés soient collectés de l'autre côté.

+0

Vous êtes incroyable, merci pour votre aide –