關於erlang的程序池

2021-08-26 22:22:04 字數 1436 閱讀 2893

有兩種情況需要考慮使用程序池管理erlang程序。

一種是普通erlang程序,很便宜,一次可以並行很多(預設32k,當然可以調整vm引數設定更大),但是這不意味著可以無限制的使用,實際上輕鬆的達到上限是很容易的(想想發明西洋棋的那位向國王請賞的辦法,類似的,乙個程序開兩個,兩個再開四個,四個再開8個。。。。,很容易就達到了上限),因此有時候我們需要對程序進行管理,避免無限制的使用累垮系統。

另一種是比較特殊的erlang程序,它有特殊的使用,在執行時可能比較耗資源(也比較耗時),就像資料庫連線池。

以上都可以用程序池的方式管理同類程序:池的大小是有限的,超出後的程序就只能在池外排隊等候了。

可惜官方還沒有提供現成的程序池模組。有一些開源的erlang程序池可供選擇,比如:[list]

[*][url=

[*][url=

[*][url=

[*]gen_server_pool,

[/list]

[size=x-large]0. 乙個程序池的實現例子[/size]

簡單的說,每個程序池頂端是乙個supervisor,它下面有乙個gen_server和乙個supervisor。後者是******_one_for_one策略的supervisor,前者管理這個supervisor,例如,前者通知後者建立乙個工作程序(通過supervisor:start_child啟動工作程序)。

[size=x-large]1. 重型程序用poolboy[/size]

如果有多個程序需要執行,這些程序執行的都是相同的**(例如某個gen_server模組,或者其它模組只要帶有start_link函式),這些程序的特點是比較耗資源,是計算或者io密集的。例如提供資料庫查詢的服務程序,建立資料庫連線就比較耗時,(當然以後的查詢資料庫等待結果也可能很費時)。對這類程序,如果臨時要用到時新開乙個程序,會在資料庫連線上先耗去好多時間,這時服務使用者只能幹等著。乙個很自然的想法就是,不管會不會用到先建立一批連線好資料庫的服務程序再說,這些預先啟動的服務程序就構成了乙個服務程序池,來乙個請求就取出乙個閒置的服務程序直接使用,用完放回程序池就行了。

poolboy就是幹這個的,這是乙個開源的erlang程序池,**量很小,三個程式檔案總共不到400行**。這個模組的結構如圖所示。這裡比較奇怪的地方是supervisor是直接掛在gen_fsm下的。這打破了我的乙個思維定思,以前一直認為supervisor也應該掛在supervisor下。

[img]

使用:從程序池中取出服務程序,使用,用完後歸還給程序池:

worker = poolboy:checkout(poolname), 

reply = gen_server:call(worker, workerfun),

poolboy:checkin(poolname, worker),

reply.

[url=文件[/url]很詳盡了,源**很少也好懂。

關於erlang的程序池

poolboy erlang 有兩種情況需要考慮使用程序池管理erlang程序。一種是普通erlang程序,很便宜,一次可以並行很多 預設32k,當然可以調整vm引數設定更大 但是這不意味著可以無限制的使用,實際上輕鬆的達到上限是很容易的 想想發明西洋棋的那位向國王請賞的辦法,類似的,乙個程序開兩個...

Erlang程序池(整理)

關鍵字 erlang,程序池,開源 1.情景 專案中有很多連線zookeeper的地方,都是各自連線,儲存pid或者monitor,並在terminate或down的時候對連線進行關閉或者重連。可以考慮採用erlang程序池,對程序進行統一管理。2種需要採用程序池的情景 1.大量的普通erlang程...

erlang程序的負載均衡

從erlang r12b 版本開始,啟動 erl時系統自動檢測 cpu核心數,並啟動相同數量的 scheduler 也可以通過 erl s number 來設定,不過啟動比 cpu核數更多的排程器不會提高效能 啟動erl 時開啟或關閉 smp symmetrical multi processor ...