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
Post a Comment