Cuesport理解
cuesport是一个简单的进程池,多用于数据库连接
调用方式
cuesport:start_link(?POOL_NAME, PoolSize, ChildMods, ChildMFA).
1.?POOL_NAME为进程池名称
2.PoolSize为进程池阈值
3.ChildMods为回调模块名称
4.ChildMFA为需添加到进程池的M:F:A
函数说明
cuesport项目函数入口:cuesport:start_link/4
start_link(PoolName, PoolSize, ChildMods, ChildMFA) ->
start_link(PoolName, PoolSize, 2*PoolSize, ChildMods, ChildMFA).
start_link(PoolName, PoolSize, MaxRestarts, ChildMods, ChildMFA) ->
Args = [PoolName, PoolSize, MaxRestarts, ChildMods, ChildMFA],
SupName = list_to_atom("cuesport_" ++ atom_to_list(PoolName) ++ "_sup"),
supervisor:start_link({local, SupName}, ?MODULE, Args).
supervisor:start_link/3新建督程并调用init/1函数
init([PoolName, PoolSize, MaxRestarts, ChildMods, ChildMFA]) ->
%新建表名为PoolName的ets表存放进程信息
PoolTable = ets:new(PoolName, [named_table, public]),
ets:insert(PoolTable, {pool_size, PoolSize}),
%{seq,N}标识进程池调用位置
ets:insert(PoolTable, {seq, 0}),
MFA = fun(Id) ->
{?MODULE, start_worker, [Id, PoolTable, ChildMFA]}
end,
Children = [{N, MFA(N), transient, 2000, worker, ChildMods}
|| N <- lists:seq(1, PoolSize)],
{ok, {{one_for_one, MaxRestarts, PoolSize}, Children}}.
%以上启动规格
%重启策略:异常终止重启,且各进程不相互影响
%进程终止超时值:2000ms
%重启频率:PoolSize秒内重启次数超过MaxRestarts终止所有进程,然后终止督程
%需加入进程池进程MFA,Id取值为1-PoolSize
start_worker(Id, PoolTable, {M, F, A}) ->
{ok, Pid} = apply(M, F, A),
ets:insert(PoolTable, {Id, Pid}),
{ok, Pid}.
使用实例直接调用官方实例:
-module(myproduct_redis).
-export([start_link/0, q/1, q/2]).
-define(POOL_NAME, myproduct_redis_pool).
start_link() ->
PoolSize = get_config(redis_pool_size),
EredisOpts = get_config(redis_worker_config),
ChildMods = [eredis, eredis_client, eredis_parser],
ChildMFA = {eredis, start_link, EredisOpts},
cuesport:start_link(?POOL_NAME, PoolSize, ChildMods, ChildMFA).
q(Query) ->
eredis:q(cuesport:get_worker(?POOL_NAME), Query).
q(Query, Opts) ->
eredis:q(cuesport:get_worker(?POOL_NAME), Query, Opts).
然后调用supervisor:start_child(Sup, ChildSpec)函数将myproduct_redis加入进程树