4

私は最近、ジョーの本を読み終えましたが、とても楽しかったです。それ以来、erlang を使用してソフト リアルタイム アプリケーションのコーディングを開始しましたが、gen_server の使用について少し混乱していると言わざるを得ません。

単純なステートレス モジュールの代わりに gen_server を使用する必要があるのはいつですか? 私はステートレス モジュールを次のように定義します。

インボイス マネージャー タイプのモジュールの場合、初期化して状態を返す必要がありますか? SomeState = InvoiceManager:Init()、SomeState = InvoiceManager:AddInvoice(SomeState, AnInvoiceFoo)。

請求書マネージャーの状態の複数のインスタンスが必要だとします (私のアプリケーションは、それぞれ独自の請求書を持つ複数の会社を管理しているとします)。それぞれが請求書を管理するための内部状態を持つ gen_server を持っている必要がありますか、それとも単にステートレス モジュールを使用する方が適切でしょうか?その上?

両者の境界線はどこにあるのでしょうか?

(上記の請求書管理の例は、私の質問を説明するための例です)

4

5 に答える 5

8

ステートレス モジュールと gen_server を区別できるとは思えません。どちらの場合も、少なくとも 1 つの引数で状態を運ぶ再帰的な受信ループがあります。このメイン ループはリクエストを処理し、リクエストに応じて機能し、必要に応じて結果をリクエスタに送り返します。メイン ループは、メイン API/プロトコルの一部ではない可能性のある多くの管理要求も処理する可能性が高くなります。

違いは、gen_server がメインの受信ループを抽象化し、ユーザーが実際のユーザー コードのみを記述できるようにすることです。また、多くの管理 OTP 機能も処理します。主な違いは、ユーザー コードが別のモジュールにあることです。これは、パススルー状態をより簡単に確認できることを意味します。実際に 1 つの大きな受信ループでコードを記述し、他の関数を呼び出して作業を行わない限り、実質的な違いはありません。

どちらの方法が優れているかは、必要なものによって大きく異なります。gen_server を使用すると、コードが簡素化され、追加機能が「無料」で提供されますが、制限が厳しくなる可能性があります。自分でロールすると、より多くの力が得られますが、物事を台無しにする可能性も高くなります。それもおそらく少し速いです。あなたは何が必要ですか?

于 2009-10-24T23:05:29.167 に答える
2

ニーズとアプリケーションの設計に大きく依存します。プロセス間で状態を共有する必要がある場合は、プロセスを使用してこの状態を維持する必要があります。次にgen_servergen_fsmまたは他の人gen_*があなたの友達です。アプリケーションが並行でない場合、またはこの設計が他の利点をもたらさない場合は、この設計を避けることができます。たとえば、アプリケーションをプロセスに分割すると、よりシンプルな設計につながります。それ以外の場合は、単一プロセス設計を選択し、パフォーマンスなどのために「ステートレス」モジュールを使用できる場合があります。「ステートレス」モジュールは、非常に単純なステートレス (純粋な機能) タスクに最適です。gen_server自然に「プロセス」と思われる場合は、多くの場合、最良の選択です。プロセス間で何かを共有したい場合に使用する必要があります (プロセスの使用は、スケーラビリティまたは同時実行性によって制限される可能性があります)。

于 2009-10-23T17:09:09.823 に答える
1

両方のモデルを使用したので、提供された gen_server を使用すると、より簡単に構造化を維持できると言わざるを得ません。これがツールの OTP スタックに含まれている理由だと思います。

于 2009-10-23T14:51:28.743 に答える
1

複数のプロセスで状態を共有している場合は、おそらく gen_server を使用する必要があります。状態が 1 つのプロセスに対してローカルである場合は、ステートレス モジュールで問題ありません。

于 2009-10-23T14:57:57.453 に答える
1

請求書 (またはそれが表すもの) は永続的であるべきだと思いますので、いずれにせよ ETS/Mnesia テーブルに配置されます。その場合は、請求書テーブルにアクセスするための API を配置するステートレス モジュールを作成する必要があります。

于 2009-10-23T18:14:21.423 に答える