Erlang入门:服务进程实例操作与练习1
2015-01-13 09:11
369 查看
这是一个用Erlang进程实现的简单银行服务
使用示例如下:
创建用户:bank:create_account(myname, 100).
用户存钱:myname ! {deposit, 10}.
用户取钱:myname ! {cash1, 20}.
myname ! {cash2, 30}.
查询余额:myname ! check.
创建用户:bank:create_account(rolong, 100).
用户存钱:rolong ! {deposit, 10}.
用户取钱:rolong ! {cash1, 20}.
rolong ! {cash2, 30}.
查询余额:rolong ! check.
使用示例如下:
创建用户:bank:create_account(myname, 100).
用户存钱:myname ! {deposit, 10}.
用户取钱:myname ! {cash1, 20}.
myname ! {cash2, 30}.
查询余额:myname ! check.
创建用户:bank:create_account(rolong, 100).
用户存钱:rolong ! {deposit, 10}.
用户取钱:rolong ! {cash1, 20}.
rolong ! {cash2, 30}.
查询余额:rolong ! check.
%% @author Rolong -module(bank). -compile(export_all). -define(I(F), io:format(F++"~n", [])). -define(I(F, A), io:format(F++"~n", A)). %% 这是一个用Erlang进程实现的简单银行服务 %% 使用示例如下: %% %% 创建用户:bank:create_account(myname, 100). %% 用户存钱:myname ! {deposit, 10}. %% 用户取钱:myname ! {cash1, 20}. %% myname ! {cash2, 30}. %% 查询余额:myname ! check. %% %% 创建用户:bank:create_account(rolong, 100). %% 用户存钱:rolong ! {deposit, 10}. %% 用户取钱:rolong ! {cash1, 20}. %% rolong ! {cash2, 30}. %% 查询余额:rolong ! check. %%'银行开户,并存入初始金额 create_account(Name, Money)-> Pid = spawn(?MODULE, server, [Money]), %% 假设年费为10 Pid ! {yearly, 10}, erlang:register(Name, Pid). %%. %%'银行服务中心 server(Money) -> receive Msg -> NewMoney = ?MODULE:handle(Msg, Money), server(NewMoney) end. %%. %%'银行服务窗口 %%'存钱 handle({deposit, AddMoney}, Money) -> NewMoney = Money + AddMoney, ?I("deposit money: ~w -> ~w", [Money, NewMoney]), NewMoney; %%. %%'取钱(可透支) handle({cash1, SubMoney}, Money) -> NewMoney = Money - SubMoney, ?I("deposit money: ~w -> ~w", [Money, NewMoney]), NewMoney; %%. %%'取钱(不可透支) handle({cash2, SubMoney}, Money) -> NewMoney = Money - SubMoney, case NewMoney > 0 of true -> %% 支取成功 ?I("deposit money: ~w -> ~w", [Money, NewMoney]), NewMoney; false -> %% 支取失败 提示余额不足 ?I("Insufficient balance, current money is ~w", [Money]), Money end; %%. %%'扣年费(这里假设10秒为一年) handle({yearly, Payment}, Money) -> Year = case get(year) of undefined -> put(year, 0), 0; Y -> YY = Y + 1, put(year, YY), YY end, erlang:send_after(10 * 1000, self(), {yearly, Payment}), if Money =< 0 -> %% 没有钱可以扣 Money; Year =:= 0 -> %% 还不到一年,不用扣 Money; true -> NewMoney = Money - Payment, case NewMoney > 0 of true -> %% 扣费成功 ?I("Yearly Payment: ~w -> ~w", [Money, NewMoney]), NewMoney; false -> %% 余额不足以扣年费,则扣到0为止 ?I("Yearly Payment: ~w -> ~w", [Money, 0]), 0 end end; %%. %%'查询 handle(check, Money) -> ?I("Current money is: ~w", [Money]), Money; %%. %%'收到目前不受理的业务,反馈给客户 handle(Msg, Money) -> ?I("Do NOT accept business:~p", [Msg]), Money. %%. %%. %% vim: set filetype=erlang foldmarker=%%',%%. foldmethod=marker:
相关文章推荐
- Erlang入门:服务进程实例操作与练习2
- Erlang入门:服务进程实例操作与练习3
- Erlang入门:进程实例操作与练习2
- Erlang入门:进程实例操作与练习1
- Erlang入门:进程实例操作与练习3(选修)
- Erlang入门:gen_server实例操作与练习1
- Erlang入门:gen_server实例操作与练习2
- Erlang入门:构建application练习4(进程link的作用)
- WCF热门问题编程示例(2)多个实例调用一个WCF服务操作,需要等待服务响应吗
- [原创]Zenoss配置入门-监控Linux的进程和IP服务
- [sed与Awk教程入门与实例练习]
- Windows server 2012 新功能试用---- powershell 3.0 进程和服务的操作 推荐
- WCF热门问题编程示例(2)多个实例调用一个WCF服务操作,需要等待服务响应吗
- COM/DCOM开发练习之进程内组件实例
- c#操作进程、服务、注册表(源码测试通过)
- COM/DCOM开发练习之进程外组件实例
- COM/DCOM开发练习之远程进程外组件实例
- javascript JSON操作入门实例
- sed与Awk教程入门与实例练习(ZZ)
- WCF热门问题编程示例(2)多个实例调用一个WCF服务操作,需要等待服务响应吗