在Erlang中,由于其函数式编程的特性,没有传统意义上的可变变量。但是,你可以使用ets
(Erlang Term Storage)表或者gen_server
等行为来实现计数功能。
Tid = ets:new(my_counter, [public, named_table]).
ets:insert(Tid, {counter, 0}).
Increment = 1,
[{counter, OldValue}] = ets:lookup(Tid, counter),
NewValue = OldValue + Increment,
ets:insert(Tid, {counter, NewValue}).
-module(my_counter_server).
-behaviour(gen_server).
-export([start_link/0, increment/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
increment() ->
gen_server:cast(?MODULE, increment).
init([]) ->
{ok, 0}.
handle_cast(increment, State) ->
{noreply, State + 1};
handle_cast(_Msg, State) ->
{noreply, State}.
handle_call(_Request, _From, State) ->
{reply, ok, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
my_counter_server:start_link().
my_counter_server:increment().
{atomic, write}
操作或者gen_server的同步调用机制来保证数据一致性。领取专属 10元无门槛券
手把手带您无忧上云