persistent_term モジュール

OTP 21.2 の目玉は persistent_term モジュールの雑感を書いていきます。

persistent_term は mochiglobal が提供していた機能をグローバルに提供する機能です。

mochiglobal は mochiweb が提供していたモジュールの一つで、簡単に言えば code と compile モジュールを利用してグローバルに値を持つことですべてのモジュールから高速にアクセスできるようにするという仕組みです。

この mochiglobal を Elixir に移植したのが Discord が公開している fastglobal です。

これを OTP が公式に BIF として提供したのが persistent_term になります。

使い方はいたってかんたんで persistent_term:put/2 と persistent_term:get/1 だけです。

この機能は「変更はほとんど行われないが、読み出しが恐ろしいほどある」場合にとても聞いてきます。

そもそも設定ファイルから値を読み込む application:get_env/2 は裏は ets ですので、思ってるより早くありません。

persitent_term は全プロセスから呼べるグローバルな値を提供します。これは本当に便利です。

例えば counters モジュールと組み合わせて、アプリケーション起動時に counters:new した Ref を persitent_term に持たせることで、すべてのプロセスからアクセスできるカウンター機能を利用できます。

今までのように ets + gen_server などをやらなくてよくなるのです。

persistent_term:put(counter_ref, counters:new(10, []).

これであとは好きなプロセスから

Ref = persistent_term:get(counter_ref),
counters:add(Ref, 1, 10).

とやればいいだけです。本当に便利です。ets をカウンターに使っていた人は早い段階で切り替えをおすすめします。

自分も今頑張って切り替えています。

まとめると persistent_term は読み込みがほぼ 100% で、書き込みがほとんどない、すべてのプロセスからアクセスしたい値を格納していおく機能です。

ぜひ、積極的に使ってきましょう。

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store