7

免責事項: 著者は OTP の初心者であり、Erlang の構文、プロセス、およびメッセージに関する基本的な知識を持っています。

Erlang での動作の概念を理解しようとしていますが、gen_server のような動作の原理全体を理解するのを妨げる多くの疑問が頭に浮かびます。

さて、gen_server の公式ドキュメントには、クエリと応答の矢印で接続されたサーバーと 3 つのクライアントの素敵な図が示されています

しかし、その概念をさらに理解しようとするたびに行き詰まります。

頭の中で 1 つの大きな概念に組み込むことができない概念がたくさんあります。

  • 動作の実装;
  • 行動コンテナ;
  • 動作インターフェイス;
  • コールバック モジュール;
  • コールバック関数;
  • API 関数。

次のリソースを使用します。

私はまだ「1つのモジュールで1つの関数を呼び出し、この関数は他の関数を呼び出し、その関数はプロセスを作成します...スタック」状態にあります

gen_server の概念を図で説明する方法はありますか? クライアントとサーバー間の対話フローを視覚的に示すにはどうすればよいでしょうか? (あまり賢くない初心者が概念を視覚的に理解できるようにするため)

たとえば、次のようになります: http://support.novell.com/techcenter/articles/img/dnd2003080506.gif

UPD:私は自分の図を描こうとしましたが、図のコネクタの目的をまだ理解していません: http://postimage.org/image/qe215ric/full/

UPD2: これは、私が見たいものに似たものです: http://cryptoanarchy.org/wiki/Worker_patterns (モデル)。ただし、モジュール、関数、およびプロセス間の相互作用は示していません。

4

1 に答える 1

12

それを説明するための正確な図はありませんが、この章と、その背後にある抽象化の原則から始まる gen_server の構築方法を示した後の章があります。

個々のコンポーネントを支援するには:

動作の実装

動作自体は、前にリンクした章に示されているものと少し似ています。これは、メッセージの受信、関数の定義、通信するための隠しプロトコルなど、すべての一般的なことを行う一連の関数を備えたモジュールです。高度な OTP には、ソフトウェアのアップグレードを行うために使用される特別な種類のメッセージと、オプションをトレースするための特別なコードが含まれています。

行動コンテナ

これがどうあるべきかわかりません。たぶん、動作の名前を持つモジュールだけでしょうか?

動作インターフェース

動作の実装と同じモジュールで、behaviour_info/1関数を定義する必要があります。その関数は、Erlang コンパイラーに、含まれているモジュールからいくつかのコールバックが予期されることを知らせます-behaviour(SomeModuleName)。は、実装と behaviour_info 関数を含む(および) ファイルSomeModuleNameに相当します。SomeModuleName.erl.beam

コールバック モジュール

すべての特定のコードを含み、すべてのカスタム要素を処理するモジュール。

コールバック関数

一般的ではないものはすべて、 の形式でコールバック モジュールに委譲されますYourModule:SomeCall(Args)。これらは、-behaviour(gen_server).行を含むモジュールによって提供されます。

API 関数

必要に応じて、コールバック モジュールには 2 つのインターフェイスがあります。gen_server動作用 (init/0、handle_call/3、handle_info/2、handle_cast/2、terminate/2、code_change/3) とユーザー用 (start) です。サーバーに何らかの情報を送信し、何らかの情報を返すように要求します)。

私はそれをそのように説明しようとすることができました

---------------------------------------------------------------------
| some process          |                server process             |
------------------------+--------------------------------------------
   [client]             |      [callback]     :        [behaviour]
                        |                     :
 callback:start >-------|---------------------:--> starting the process
                        |                     :           V
                        |                     :           |
                        |       init()  <-----:-----------`
                        |         |           :
                        |         `-----------:------> initial state
  {ok, Pid}  <----------|---------------------:----------,/
                        |                     :
 callback:store  >------|---------------------:--> handles message
 (calls the process)    |    (formats msg)    :           V
                        |                     :           |
                        |    handle_call() <--:-----------` 
                        |         |           :
                        |          `----------:--> updates state, sends reply
                        |                     :        V
                        |                     :        |
   gets result <--------|---------------------:--------`
                        |                     :       

すべての一般的な部分は、動作内のサーバー プロセスの右側にあり、すべての特定の部分は左側にあります (コールバック)。クライアントは、コールバック モジュールの API/インターフェイスを使用してサーバー プロセスに接続し、サーバー プロセスに影響を与えます。

特定のコード (これらのメッセージにどのように反応するか) に対する実行フロー (メッセージの送受信などのより正確な部分) を時々放棄する、ある種の非常に一般的なコード セグメントとして動作を確認する必要があります。

うまくいけば、これが役に立ちます。

于 2011-08-11T16:30:34.933 に答える