erlang进程池-poolboy源码分析

本文详细分析了Poolboy的初始化过程,包括通过poolboy:child_spec调用start_link,gen_server的启动,以及init阶段的数据初始化。接着探讨了Poolboy的核心方法transaction、checkout和checkin的功能,解释了worker的生命周期管理和用户进程关闭的处理策略。通过对Poolboy源码的分析,展示了其高效简洁的设计思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文以作者提供的example.erl为入口进行分析
地址 : https://github.com/devinus/poolboy

-module(example).
-behaviour(application).
-behaviour(supervisor).

-export([start/0, stop/0, squery/2, equery/3]).
-export([start/2, stop/1]).
-export([init/1]).

start() ->
    application:start(?MODULE).

stop() ->
    application:stop(?MODULE).

start(_Type, _Args) ->
    supervisor:start_link({
   
   local, example_sup}, ?MODULE, []).

stop(_State) ->
    ok.

init([]) ->
    {
   
   ok, Pools} = application:get_env(example, pools),
    PoolSpecs = lists:map(fun({
   
   Name, SizeArgs, WorkerArgs}) ->
        PoolArgs = [{
   
   name, {
   
   local, Name}},
            		{
   
   worker_module, example_worker}] ++ SizeArgs,
        poolboy:child_spec(Name, PoolArgs, WorkerArgs)
    end, Pools),
    {
   
   ok, {
   
   {
   
   one_for_one, 10, 10}, PoolSpecs}}.

squery(PoolName, Sql) ->
    poolboy:transaction(PoolName, fun(Worker) ->
        gen_server:call(Worker, {
   
   squery, Sql})
    end).

equery(PoolName, Stmt, Params) ->
    poolboy:transaction(PoolName, fun(Worker) ->
        gen_server:call(Worker, {
   
   equery, Stmt, Params})
    end).

poolboy初始化分析

1.在这个demo中,在init中通过 poolboy:child_spec(Name, PoolArgs, WorkerArgs) 调用poolboy:start_link/2

child_spec(PoolId, PoolArgs, WorkerArgs) ->
    {
   
   PoolId, {
   
   poolboy, start_link, [PoolArgs, WorkerArgs]},
     permanent, 5000, worker, [poolboy]}.

2. 在poolboy:start_link/2中进一步调用gen_server:start_link/3,4

start_link(PoolArgs, WorkerArgs)  ->
    start_pool(start_link, PoolArgs, WorkerArgs).
    
start_pool(StartFun, PoolArgs, WorkerArgs) ->
    case proplists:get_value(name, PoolArgs) of
        undefined ->
            gen_server:StartFun(?MODULE, {
   
   PoolArgs, WorkerArgs}, []);
        Name ->
            gen_server:StartFun(Name, ?MODULE, {
   
   PoolArgs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值