SlideShare a Scribd company logo
1 of 16
Download to read offline
Poolboy
 Erlang入門
お前誰よ
• 村岡友介
• @jbking
• Python, JS with TypedArray
• OTP使いこなしたい
• Emacs久しぶりにインストール
ワーカープール
     使ってますよね?


• pg_pool
• ThreadPoolExecutor
• MPM worker/prefork
なぜワーカープールを
   使いたいか


• 重い初期化処理を何回もやりたくない
 • 初期化済みですぐ結果を返したい
• リソースの同時使用を制限したい
Poolboy
 2a03513
Usage
                           プール名        (atom() as node())




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


                       ワーカープロセス (pid())

gen_serverの下でワーカープロセスと
           通信する
ワーカー定義

• -behaviour(gen_server).
• -behaviour(poolboy_worker).
 • start_link/1
      単なるgen_serverだよ!
Internal
Initialize
% poolboy.erl:77
start(PoolArgs, WorkerArgs) ->
    start_pool(start, PoolArgs, WorkerArgs).


% poolboy.erl:89
start_link(PoolArgs, WorkerArgs) ->
    start_pool(start_link, PoolArgs, WorkerArgs).


% poolboy.erl:223
                     ワーカープール初期化
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, WorkerArgs},
    end.
Initialize
            gen_server module            Callback module
            -----------------            ---------------
            gen_server:start_link -----> Module:init/1




% poolboy.erl:91
                                 ワーカープール初期化
init({PoolArgs, WorkerArgs}) ->
    process_flag(trap_exit, true),
    Waiting = queue:new(),
    Monitors = ets:new(monitors, [private]),
                                                     State構築
    init(PoolArgs, WorkerArgs, #state{waiting = Waiting, monitors = Mon

                  poolboyプール自身も
               gen_serverの下で動いている
Transaction
                      さっきのpoolboy:transaction/3
% poolboy.erl:48           プールからワーカーを取り出して
transaction(Pool, Fun, Timeout) ->
    Worker = poolboy:checkout(Pool, true, Timeout),
    try
         Fun(Worker)       実行して
    after
         ok = poolboy:checkin(Pool, Worker)
    end.
                           終わったらプールに戻す
Checkout
% poolboy.erl:133
handle_call({checkout, Block, Timeout}, {FromPid, _} = From, State) ->
    #state{supervisor = Sup,
           workers = Workers,
           monitors = Monitors,
           overflow = Overflow,
           max_overflow = MaxOverflow} = State,
    case queue:out(Workers) of
        {{value, Pid}, Left} ->  プールからPidを取り出す
            Ref = erlang:monitor(process, FromPid),
            true = ets:insert(Monitors, {Pid, Ref}),
            {reply, Pid, State#state{workers = Left}};
        {empty, Empty} when MaxOverflow > 0, Overflow < MaxOverflow ->
            ...

                                   プロセスをモニターに登録
Checkin
% poolboy.erl:119
handle_cast({checkin, Pid}, State = #state{monitors = Monitors}) ->
    case ets:lookup(Monitors, Pid) of
         [{Pid, Ref}] ->           モニターから解除
             true = erlang:demonitor(Ref),
             true = ets:delete(Monitors, Pid),
             NewState = handle_checkin(Pid, State),
             {noreply, NewState};
         [] ->                   待ちプロセスにワーカーを
             {noreply, State}
    end;                            割り当てる
Worker may crash
Monitor/Trap
% poolboy.erl:180                 Monitor
handle_info({'DOWN', Ref, _, _, _}, State) ->
    case ets:match(State#state.monitors, {'$1', Ref}) of
         [[Pid]] ->
             ...
         [] ->
             ...
    end;                          Trap
handle_info({'EXIT', Pid, _Reason}, State) ->
    #state{supervisor = Sup,
            monitors = Monitors} = State,
    case ets:lookup(Monitors, Pid) of
         [{Pid, Ref}] ->
             ...
         [] ->
             ...
    end;
おわり

More Related Content

What's hot

Functions
FunctionsFunctions
Functionsdo_aki
 
node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装Yohei Fushii
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020Fujio Kojima
 
コマンド実行結果のログ取得について
コマンド実行結果のログ取得についてコマンド実行結果のログ取得について
コマンド実行結果のログ取得についてKoji Kawaguchi
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.ContextAkira Takahashi
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
 
自作saoriの紹介
自作saoriの紹介自作saoriの紹介
自作saoriの紹介wizstargaer
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいcharsbar
 
Dev club season 2 extensionsapi workshop
Dev club season 2   extensionsapi workshopDev club season 2   extensionsapi workshop
Dev club season 2 extensionsapi workshopHiroshi Masuda
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発Shinzo SAITO
 
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題Masahiro Nagano
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~Fujio Kojima
 
Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau JavaScript API編
Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau JavaScript API編Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau JavaScript API編
Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau JavaScript API編Hiroshi Masuda
 

What's hot (19)

Functions
FunctionsFunctions
Functions
 
pecl-AOPの紹介
pecl-AOPの紹介pecl-AOPの紹介
pecl-AOPの紹介
 
Synthesijer hls 20150116
Synthesijer hls 20150116Synthesijer hls 20150116
Synthesijer hls 20150116
 
node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
 
test
testtest
test
 
コマンド実行結果のログ取得について
コマンド実行結果のログ取得についてコマンド実行結果のログ取得について
コマンド実行結果のログ取得について
 
Testman
TestmanTestman
Testman
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
Mock and patch
Mock and patchMock and patch
Mock and patch
 
あらためてPHP5.3
あらためてPHP5.3あらためてPHP5.3
あらためてPHP5.3
 
自作saoriの紹介
自作saoriの紹介自作saoriの紹介
自作saoriの紹介
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
Dev club season 2 extensionsapi workshop
Dev club season 2   extensionsapi workshopDev club season 2   extensionsapi workshop
Dev club season 2 extensionsapi workshop
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
 
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau JavaScript API編
Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau JavaScript API編Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau JavaScript API編
Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau JavaScript API編
 

Viewers also liked

The Substance D - Plone Symposium Tokyo 2015
The Substance D - Plone Symposium Tokyo 2015The Substance D - Plone Symposium Tokyo 2015
The Substance D - Plone Symposium Tokyo 2015Yusuke Muraoka
 
Debug it-python-hack-a-thon-2011.02
Debug it-python-hack-a-thon-2011.02Debug it-python-hack-a-thon-2011.02
Debug it-python-hack-a-thon-2011.02Yusuke Muraoka
 
プロパティディスクリプタとその拡張ライブラリ
プロパティディスクリプタとその拡張ライブラリプロパティディスクリプタとその拡張ライブラリ
プロパティディスクリプタとその拡張ライブラリYusuke Muraoka
 
App Engineと非同期とテストと私
App Engineと非同期とテストと私App Engineと非同期とテストと私
App Engineと非同期とテストと私Yusuke Muraoka
 

Viewers also liked (6)

The Substance D - Plone Symposium Tokyo 2015
The Substance D - Plone Symposium Tokyo 2015The Substance D - Plone Symposium Tokyo 2015
The Substance D - Plone Symposium Tokyo 2015
 
Debug it-python-hack-a-thon-2011.02
Debug it-python-hack-a-thon-2011.02Debug it-python-hack-a-thon-2011.02
Debug it-python-hack-a-thon-2011.02
 
Django learning
Django learningDjango learning
Django learning
 
プロパティディスクリプタとその拡張ライブラリ
プロパティディスクリプタとその拡張ライブラリプロパティディスクリプタとその拡張ライブラリ
プロパティディスクリプタとその拡張ライブラリ
 
App Engineと非同期とテストと私
App Engineと非同期とテストと私App Engineと非同期とテストと私
App Engineと非同期とテストと私
 
Django learning Part2
Django learning Part2Django learning Part2
Django learning Part2
 

Similar to Poolboy

OpenFlowコントローラ開発支援ツールの提案
OpenFlowコントローラ開発支援ツールの提案OpenFlowコントローラ開発支援ツールの提案
OpenFlowコントローラ開発支援ツールの提案Yutaka Yasuda
 
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」Aya Komuro
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code ReadingKenichirou Oyama
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~leverages_event
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 sessionfreedom404
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
MySQLとPostgreSQLの基本的な実行プラン比較
MySQLとPostgreSQLの基本的な実行プラン比較MySQLとPostgreSQLの基本的な実行プラン比較
MySQLとPostgreSQLの基本的な実行プラン比較Shinya Sugiyama
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミングlestrrat
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義ria1201
 
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道20123時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012Yusuke Ando
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixirk1complete
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するshigeki_ohtsu
 
Azure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライAzure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライMasanobu Sato
 
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料codeal
 

Similar to Poolboy (16)

VerilatorとSystemC
VerilatorとSystemCVerilatorとSystemC
VerilatorとSystemC
 
OpenFlowコントローラ開発支援ツールの提案
OpenFlowコントローラ開発支援ツールの提案OpenFlowコントローラ開発支援ツールの提案
OpenFlowコントローラ開発支援ツールの提案
 
Tottoruby 20110903
Tottoruby 20110903Tottoruby 20110903
Tottoruby 20110903
 
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code Reading
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
MySQLとPostgreSQLの基本的な実行プラン比較
MySQLとPostgreSQLの基本的な実行プラン比較MySQLとPostgreSQLの基本的な実行プラン比較
MySQLとPostgreSQLの基本的な実行プラン比較
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
 
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道20123時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixir
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 
Azure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライAzure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライ
 
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
 

More from Yusuke Muraoka

いかにして問題をとくか
いかにして問題をとくかいかにして問題をとくか
いかにして問題をとくかYusuke Muraoka
 
Pythonistaで始めるiOSプロトタイプ開発
Pythonistaで始めるiOSプロトタイプ開発Pythonistaで始めるiOSプロトタイプ開発
Pythonistaで始めるiOSプロトタイプ開発Yusuke Muraoka
 
私のPythonとの関わりかた
私のPythonとの関わりかた私のPythonとの関わりかた
私のPythonとの関わりかたYusuke Muraoka
 
Substance D world-plone-day-2017
Substance D world-plone-day-2017Substance D world-plone-day-2017
Substance D world-plone-day-2017Yusuke Muraoka
 
Pythonistaの使い方
Pythonistaの使い方Pythonistaの使い方
Pythonistaの使い方Yusuke Muraoka
 
Gunma.web #24 MySQL HA
Gunma.web #24 MySQL HAGunma.web #24 MySQL HA
Gunma.web #24 MySQL HAYusuke Muraoka
 
Can A Python Go Beyond The Python
Can A Python Go Beyond The PythonCan A Python Go Beyond The Python
Can A Python Go Beyond The PythonYusuke Muraoka
 

More from Yusuke Muraoka (9)

いかにして問題をとくか
いかにして問題をとくかいかにして問題をとくか
いかにして問題をとくか
 
Pythonistaで始めるiOSプロトタイプ開発
Pythonistaで始めるiOSプロトタイプ開発Pythonistaで始めるiOSプロトタイプ開発
Pythonistaで始めるiOSプロトタイプ開発
 
私のPythonとの関わりかた
私のPythonとの関わりかた私のPythonとの関わりかた
私のPythonとの関わりかた
 
Substance D world-plone-day-2017
Substance D world-plone-day-2017Substance D world-plone-day-2017
Substance D world-plone-day-2017
 
Pythonistaの使い方
Pythonistaの使い方Pythonistaの使い方
Pythonistaの使い方
 
Gunma.web #24 MySQL HA
Gunma.web #24 MySQL HAGunma.web #24 MySQL HA
Gunma.web #24 MySQL HA
 
Pyramid Security
Pyramid SecurityPyramid Security
Pyramid Security
 
Some about chef
Some about chefSome about chef
Some about chef
 
Can A Python Go Beyond The Python
Can A Python Go Beyond The PythonCan A Python Go Beyond The Python
Can A Python Go Beyond The Python
 

Recently uploaded

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 

Recently uploaded (7)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

Poolboy

  • 2. お前誰よ • 村岡友介 • @jbking • Python, JS with TypedArray • OTP使いこなしたい • Emacs久しぶりにインストール
  • 3. ワーカープール 使ってますよね? • pg_pool • ThreadPoolExecutor • MPM worker/prefork
  • 4. なぜワーカープールを 使いたいか • 重い初期化処理を何回もやりたくない • 初期化済みですぐ結果を返したい • リソースの同時使用を制限したい
  • 6. Usage プール名 (atom() as node()) squery(PoolName, Sql) -> poolboy:transaction(PoolName, fun(Worker) -> gen_server:call(Worker, {squery, Sql}) end). ワーカープロセス (pid()) gen_serverの下でワーカープロセスと 通信する
  • 9. Initialize % poolboy.erl:77 start(PoolArgs, WorkerArgs) -> start_pool(start, PoolArgs, WorkerArgs). % poolboy.erl:89 start_link(PoolArgs, WorkerArgs) -> start_pool(start_link, PoolArgs, WorkerArgs). % poolboy.erl:223 ワーカープール初期化 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, WorkerArgs}, end.
  • 10. Initialize gen_server module Callback module ----------------- --------------- gen_server:start_link -----> Module:init/1 % poolboy.erl:91 ワーカープール初期化 init({PoolArgs, WorkerArgs}) -> process_flag(trap_exit, true), Waiting = queue:new(), Monitors = ets:new(monitors, [private]), State構築 init(PoolArgs, WorkerArgs, #state{waiting = Waiting, monitors = Mon poolboyプール自身も gen_serverの下で動いている
  • 11. Transaction さっきのpoolboy:transaction/3 % poolboy.erl:48 プールからワーカーを取り出して transaction(Pool, Fun, Timeout) -> Worker = poolboy:checkout(Pool, true, Timeout), try Fun(Worker) 実行して after ok = poolboy:checkin(Pool, Worker) end. 終わったらプールに戻す
  • 12. Checkout % poolboy.erl:133 handle_call({checkout, Block, Timeout}, {FromPid, _} = From, State) -> #state{supervisor = Sup, workers = Workers, monitors = Monitors, overflow = Overflow, max_overflow = MaxOverflow} = State, case queue:out(Workers) of {{value, Pid}, Left} -> プールからPidを取り出す Ref = erlang:monitor(process, FromPid), true = ets:insert(Monitors, {Pid, Ref}), {reply, Pid, State#state{workers = Left}}; {empty, Empty} when MaxOverflow > 0, Overflow < MaxOverflow -> ... プロセスをモニターに登録
  • 13. Checkin % poolboy.erl:119 handle_cast({checkin, Pid}, State = #state{monitors = Monitors}) -> case ets:lookup(Monitors, Pid) of [{Pid, Ref}] -> モニターから解除 true = erlang:demonitor(Ref), true = ets:delete(Monitors, Pid), NewState = handle_checkin(Pid, State), {noreply, NewState}; [] -> 待ちプロセスにワーカーを {noreply, State} end; 割り当てる
  • 15. Monitor/Trap % poolboy.erl:180 Monitor handle_info({'DOWN', Ref, _, _, _}, State) -> case ets:match(State#state.monitors, {'$1', Ref}) of [[Pid]] -> ... [] -> ... end; Trap handle_info({'EXIT', Pid, _Reason}, State) -> #state{supervisor = Sup, monitors = Monitors} = State, case ets:lookup(Monitors, Pid) of [{Pid, Ref}] -> ... [] -> ... end;