2017-09-15 5 views
0

Je crée un module serveur/client Elixir de base qui peut envoyer/recevoir des messages asynchrones. Le module ressemble à suivre. J'initie les processus à travers la console iex en utilisant.Elixir: comment envoyer une notification au serveur dans handle_cast?

{:ok, pid1} = Bitcoin.WorkerOne.start_link([]) 
Bitcoin.WorkerOne.get_message(pid1, ["one"]) 

Après ce qui précède, l'état passe à ['one'] (liste initialement vide). Je veux envoyer une notification au serveur que l'état a été mis à jour. Puis-je appeler 'Genserver.cast' à l'intérieur du handle_cast, afin de renvoyer un message?

Répondre

2

Vous devez inclure le pid de l'expéditeur dans le message au serveur lors de l'utilisation des moulages où vous souhaitez envoyer une notification, mais il est préférable d'utiliser des appels combinés avec GenServer.reply/2, retour {:noreply, state} dans le rappel handle_call pour ce cas d'utilisation, pour obtenir la garantie que le serveur a reçu la demande. Réimplémenter manuellement les réponses, c'est beaucoup de travail en fonction des garanties dont vous avez besoin, donc vous devriez l'éviter.

+0

En cas de handle_call, il attendra la fin de la tâche. Does' {: noreply, state} 'fonctionne-t-il autour de ça? – COSTA

+1

L'utilisation des appels du client est importante lorsque vous avez besoin d'une réponse, ou d'une garantie que le serveur a reçu la demande et agit sur elle. Si vous renvoyez '{: noreply, state}', il est prévu que vous ayez déjà répondu ou que vous répondiez dans le futur en utilisant 'GenServer.reply/2'. Cela vous permet de contrôler quand les réponses sont envoyées tout en conservant les garanties fournies par les appels, y compris les délais d'attente et les plantages. L'appelant bloquera, mais vous pouvez répondre tôt pour minimiser cela, ou utiliser des lancers avec le pid du lanceur de sorts si la requête est vraiment tirée et oublie. – bitwalker