otp - Erlang Gen_call vs Gen_cast -


erlang otp said gen_server:call synchronous , gen_server:cast asynchronous.

after testing, find gen_server:call synchronous . however, gen_server:cast send message mailbox, did not run tasks in parallel.

how can create multi processes run?

-module(example_gen). -behaviour(gen_server). -export([start_link/0]). -export([init/1,     handle_call/3,     handle_cast/2,     handle_info/2,     terminate/2,     code_change/3]).   -export([       add_bycall/2,       add_bycast/2    ]).     -define(server, ?module).    -record(state, {}).   add_bycall(key, value) ->    gen_server:call(?server, {bycall, key, value}).   add_bycast(key, value) ->       gen_server:cast(?server, {bycast, key, value}).    example(key, value) ->        timer:sleep(2000),       io:format("finished [~p, ~p] @ [~p] ~n", [key, value, erlang:system_time(milli_seconds)]).  start_link() ->     gen_server:start_link({local, ?server}, ?module, [], []).  init([]) ->    {ok, #state{}}.   handle_call({bycall, key, value}, _from, state) ->       example(key, value),       {reply, ok, state};   handle_call(_request, _from, state) ->      {reply, ok, state}.    handle_cast({bycast, key, value}, state) ->     example(key, value),       {noreply, state};  handle_cast(_request, state) ->        {noreply, state}.   handle_info(_info, state) ->    {noreply, state}.   terminate(_reason, _state) ->    ok.   code_change(_oldvsn, state, _extra) ->     {ok, state}. 

running code

[example_gen:add_bycall(k, k) ||  k <-  lists:seq(1, 10) ].  [example_gen:add_bycast(k, k) ||  k <-  lists:seq(1, 10) ]. 

terms synchronous , asynchronous orthogonal terms serial , parallel. gen_server:call/2,3 synchronous caller , gen_server:cast/2 asynchronous caller. work performed 1 gen_server serial because performed 1 process.

what terms asynchronous , synchronous means in case. if have code

gen_server:call(s, foo), bar(), 

work triggered foo performed before bar/0 , bar/0 performed after work foo finished. foo , bar/0 synchronous. if have code

gen_server:cast(s, foo), bar(), 

work triggered foo can performed before bar/0 after or in parallel on smp systems. foo , bar/0 asynchronous. synchronization matters between caller , callee.


Comments