Je ne sais pas vraiment pourquoi je n'y arrive pas, mais je suis sûr que la réponse est extraordinairement simple. Je suis juste en train de tester quelques trucs et j'ai découvert lors de mes tests que j'aimerais lancer un processus à l'intérieur de handle_info
de mon gen_server
.
Cependant, bien que j'aie essayé différentes combinaisons, le meilleur résultat que j'obtienne de mon enfant est de mourir avec une erreur et de renvoyer {undef, [{bob, hello, [], []}]}
.
Code :
-module(test).
-behaviour(gen_server).
-export([start_link/1, init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
start_link(Args) ->
gen_server:start_link({local, Args}, ?MODULE, Args, []).
init(Args) ->
io:format("Init ~p ~p~n",[self(), Args]),
{ok, Args}.
handle_call(_, _, State) ->
io:format("Call ~p~n",[self()]),
{reply, ok, State}.
handle_cast(_, State) ->
io:format("Cast ~p~n",[self()]),
{noreply, State}.
handle_info(_, State) ->
io:format("Info ~p~n",[self()]),
spawn(?MODULE,fun hello/1,[]),
{noreply, State}.
terminate(_, _) ->
ok.
code_change(_, State, _) ->
{ok, State}.
hello([]) ->
io:format("WOOT ~p~n",[self()]).
Mon premier objectif était de déterminer si plusieurs serveurs pouvaient être démarrés avec un seul module. Le second était de savoir si handle_info
a été exécuté dans un processus séparé... pour une raison quelconque, quand j'ai lu qu'il était asynchrone, j'ai pensé qu'il était dans un autre processus. Maintenant le troisième est de créer un processus dans cet appel.
Ma coquille typique ressemble à quelque chose comme (avec des commentaires) :
> c(test), {ok, P} = gen_server:start_link(bob)
> %% Warns me the function hello in any incarnation is not used
> P ! woot.
> %% An error of some kind depending on what I've done
> f(P), gen_server:stop(bob).
J'ai utilisé hello/1
avec []
et _
, hello/0
. Ainsi que spawn/1
, spawn/3
, spawn_link/1
et spawn_link/3
... J'ai utilisé ?MODULE
, test
, State
et pour les rires {local, State}
comme paramètre du module. Je me suis séparé de ce que j'ai vu sur plusieurs sites web et j'ai mis en fun hello/0
et fun hello/1
lors de la transmission de la fonction. Cela produit des plantages mais permet de se débarrasser de l'avertissement du compilateur.
Où ai-je fait fausse route ?