ヽ(´・肉・`)ノログ

How do we fighting without fighting?

すごいE本をElixirでやる(38)

第 13 章 並行アプリケーションを設計する - 13.5 イベントサーバ - お熱いコードがお好き から

ErlangVMのホットコードローディングを利用するために,とても大事なことが書かれていた.

ホットコードローディングを考慮したプログラミングをする場合は,完全修飾呼び出しとローカル呼び出しは等価ではない点に気をつけよう.

13.5 イベントサーバ

お熱いコードがお好き

ホットコードローディングをするために、Erlang にはコードサーバと呼ばれるものがあります。 コードサーバは、ETS テーブル(仮想マシン上のネイティブなインメモリデータベーステーブル、第 25 章で説明します)を管理している仮想マシンのプロセスです。 コードサーバは、メモリ上で 1 つのモジュールの 2 つのバージョンを保持し、両方を同時に実行できます。

Erlang にはローカル呼び出しと外部呼び出しの両方があります。 ローカル呼び出しは、export されていない関数による関数呼び出しで、〔名前〕(〔引数〕) の形式をしています。 一方の外部呼び出しは、export された関数 のみによるもので、〔モジュール〕:〔関数〕(〔引数〕) の形式をしています。 外部呼び出しの正式な名前は完全修飾呼び出しです。

完全修飾呼び出しは、常にコードサーバ内にある最新のバージョンで行われます。

defmodule Hotload do
  def server(state) do
    receive do
      :update ->
        new_state = __MODULE__.update(state)
        # Loop in the new version of the module.
        __MODULE__.server(new_state)
      some_message ->
        # Do something here.
        server(state) # Stay in the same version no matter what.
    end
  end

  def upgrade(old_state) do
    # Transform and return the state here.
  end
end