OTPアプリケーションで名前が付けられたgen_serversを操作するためのチュートリアルはたくさんあります。ただし、登録されていない(名前が付けられていない)サーバーを動的に生成する良い例を見つけることができませんでした。誰かが良い、簡単な例を指摘できますか?たとえば、私が得ようとしている核となるアイデアを混乱させることがたくさんある場合は、ejabberdではありません。
ありがとう。
OTPアプリケーションで名前が付けられたgen_serversを操作するためのチュートリアルはたくさんあります。ただし、登録されていない(名前が付けられていない)サーバーを動的に生成する良い例を見つけることができませんでした。誰かが良い、簡単な例を指摘できますか?たとえば、私が得ようとしている核となるアイデアを混乱させることがたくさんある場合は、ejabberdではありません。
ありがとう。
最も簡単な例は次のとおりです。gen_server:start
の最初の引数{local、name}を省略します。つまり、モジュールがmodと呼ばれると仮定します。
start(ArgX) ->
gen_server:start(mod, [ArgX], []).
その後、あなたはします:
> {ok, Pid} = gen_server:start(mod, [66], []).
gen_serverが稼働しています。
この関数を呼び出すたびに、名前のない新しいgen_serverプロセスが生成されます。この例では、(スーパーバイザコンテキストの外部で)スタンドアロンで使用するためにstart(start_linkではなく)を使用していることに注意してください。
http://github.com/noss/iserveで、監視ツリーでワーカーの動的な生成が行われています。iserveアプリケーションには、マスター登録されたプロセスがありますiserve_master
。これは、1つのモードスーパーバイザー用の単純なプロセスと一緒に監視されます。
これiserve_master
は、iserveにhttpサーバーの起動を要求するためのものです。一意のアドレスにバインドする限り、複数のIserverを持つことができます。起動したサーバーは自分で名前を作成しますが、デバッグを簡素化するために、ポート名を使用してアトムを生成します。
iserve_socket
サーバーは、接続を受け入れたことについてのコールバックを待機する「永遠の」ループです。initで最初のものを開始します。
開始されたソケットは、とにかくhttpソケット接続を失うことなく再起動できないため、監視されていません。そして、私はそれを気にしないためのちょっとした機能だと思っています。ファイアアンドフォーゲット。
完璧にはほど遠いですが、私がやや気に入っているアーキテクチャです。
rabbitmq -shovelプラグインにはこの例があるようです-rabbit_shovel_sup.erlとrabbit_shovel_worker.erlを参照してください。構成ファイルの設定に基づいてワーカーgen_serverプロセスを生成します。