erlang之gen_server的例子
星期二, 2014-08-19 | Author: Lee | erlang, webgame | 4,229 views
一个简单版的gen_server的demo例子(银行存款问题了)
同时加了一个自动存钱的功能
-module(my_bank). -behaviour(gen_server). -export([start/0]). -export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2,code_change/3]). -compile(export_all). start() -> gen_server:start_link({local,?MODULE},?MODULE,[],[]), spawn(fun() -> loop() end). stop() -> gen_server:call(?MODULE,stop). new_account(Who) -> gen_server:call(?MODULE,{new,Who}). deposit(Who,Amount) -> gen_server:call(?MODULE,{add,Who,Amount}). withdraw(Who,Amount) -> gen_server:call(?MODULE,{remove,Who,Amount}). autoloop_account(Who) -> gen_server:call(?MODULE,{autoaccount,Who}). init([]) -> {ok,ets:new(?MODULE,[])}. handle_call({autoaccount,Who},_Form,Tab) -> Replay = case ets:lookup(Tab,Who) of [] -> ets:insert(Tab,{Who,0}), {welcome,Who}; [_] -> {Who,exsit} end, {reply,Replay,Tab}; handle_call({new,Who},_Form,Tab) -> Replay = case ets:lookup(Tab,Who) of [] -> ets:insert(Tab,{Who,0}), {welcome,Who}; [_] -> {Who,you_already_are_a_customer} end, {reply,Replay,Tab}; handle_call({add,Who,X},_Form,Tab) -> Replay = case ets:lookup(Tab,Who) of [] -> no_a_customer; [{Who,Balance}] -> NewBalance = Balance + X, ets:insert(Tab,{Who,NewBalance}), {thanks,Who,you_balance_is,NewBalance} end, {reply,Replay,Tab}; handle_call({remove,Who,X},_Form,Tab) -> Replay = case ets:lookup(Tab,Who) of [] -> no_a_customer; [{Who,Balance}] when X=< Balance -> NewBalance = Balance - X, ets:insert(Tab,{Who,NewBalance}), {thanks,Who,you_balance_is,NewBalance}; [{Who,Balance}] -> {sorry,Who,you_only_have,Balance,in_the_bank} end, {reply,Replay,Tab}; handle_call(stop,_Form,Tab) -> {stop,normal,stopped,Tab}. handle_cast(_Msg,State) -> {noreply,State}. handle_info(_Info,State) -> {noreply,State}. terminate(_Reason,_State) -> ok. code_change(_OldVsn,State,Extra) -> {ok,State}. loop() -> %io:format("loop msg start~n"), sleep(), Who = "sara", autoloop_account(Who), Nmsg = deposit(Who,100), io:format("now sara balance ~p~n",[Nmsg]), Curnum = erlang:system_info(process_count), io:format("process_count ~p~n",[Curnum]), loop(). sleep() -> receive after 10000 -> true end. |
编译执行下列命令就可以看到对应的信息
Eshell > c(my_bank). Eshell > my_bank:start(). Eshell > my_bank:new_account("sara"). Eshell > my_bank:deposit("sara", 100). Eshell > my_bank:deposit("sara", 200). Eshell > my_bank:withdraw("sara", 10). Eshell > my_bank:withdraw("sara", 10000). Eshell > my_bank:stop(). |
文章作者: Lee
本文地址: https://www.pomelolee.com/1357.html
除非注明,Pomelo Lee文章均为原创,转载请以链接形式标明本文地址
No comments yet.
Leave a comment
Search
相关文章
热门文章
最新文章
文章分类
- ajax (10)
- algorithm-learn (3)
- Android (6)
- as (3)
- computer (85)
- Database (30)
- disucz (4)
- enterprise (1)
- erlang (2)
- flash (5)
- golang (3)
- html5 (18)
- ios (4)
- JAVA-and-J2EE (186)
- linux (143)
- mac (10)
- movie-music (11)
- pagemaker (36)
- php (50)
- spring-boot (2)
- Synology群晖 (2)
- Uncategorized (6)
- unity (1)
- webgame (15)
- wordpress (33)
- work-other (2)
- 低代码 (1)
- 体味生活 (40)
- 前端 (21)
- 大数据 (8)
- 游戏开发 (9)
- 爱上海 (19)
- 读书 (4)
- 软件 (3)