Cuesport理解

来源:互联网 发布:怎样在淘宝买微博小号 编辑:程序博客网 时间:2024/06/11 17:50

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-PoolSizestart_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加入进程树

0 0