4

現在、Erlang 開発の段階で C ノードを作成する必要があります ( C ノードのドキュメントへのリンクを参照してください)。基本的な実装は単純ですが、ドキュメントには大きな穴があります。

このコードは、シングル スレッドのクライアントとサーバーを実装します。しばらくクライアントを無視します... サーバーを実装する 'c' コードはシングル スレッドであり、一度に 1 つの erlang クライアントにしか接続できません。

  1. EPMD を起動します ('epmd -daemons')
  2. サーバー アプリケーション ('cserver 1234') を起動します。
  3. erlang クライアント アプリケーションを起動します ('erl -sname e1 -setcookie secretcookie') [#2 とは別のウィンドウで]
  4. #3 の erlang シェルからサーバー コマンド ('complex3:foo(3).') を実行します。

サーバーが実行され、現在の erlang シェルがサーバーに接続されたので、別のウィンドウから再試行してください。

  1. 新しいウィンドウを開きます。
  2. erlang クライアントを起動します ('erl -sname e2 -setcookie secretcookie')。
  3. 新しいサーバー コマンド ('complex3:foo(3)') を実行します。

システムがハングしているように見えることに注意してください...コマンドを実行する必要があるときに。ハングする理由は、他の erlang ノードが接続されており、接続をリッスンしているスレッドが他にないためです。

注:接続処理にバグがあるようです。受信ブロックにタイムアウトを追加し、いくつかの異常な動作をキャッチしましたが、すべてを取得することはできませんでした。また、指示された手順を実行した後に最初の erlang ノードを強制的に終了させた場合、警告やエラーなしで cserver をクラッシュさせることができました。

そこで質問です... スレッド化された C-Node を実装する最良の方法は何ですか? 妥当な接続数はいくつですか?

4

1 に答える 1

4

cnode チュートリアルの cnode 実装例は、接続された複数のノードを処理するためのものではないため、最初に発生する症状は正常です。

呼び出しは、erl_accept着信接続を受け入れるものです。

if ((fd = erl_accept(listen, &conn)) == ERL_ERROR)
  erl_err_quit("erl_accept");
fprintf(stderr, "Connected to %s\n\r", conn.nodename);
while (loop) {
  got = erl_receive_msg(fd, buf, BUFSIZE, &emsg);

このように記述すると、cnode は 1 つの接続のみを受け入れ、記述子を読み取り/書き込みループに渡すことに注意してください。erl_receive_msgそのため、erlang ノードが閉じると、c ノードがエラーで終了しfdます。

複数のインバウンド接続を受け入れたい場合は、接続を受け入れてループし、複数のファイル記述子を処理する方法を実装する必要があります。pollそのためにマルチスレッド プログラムは必要ありません。OS がそれらをサポートしている場合は、またはselectsyscallを使用する方がおそらく簡単 (かつ効率的) でしょう。

最適な接続数については、ルールはないと思います。cnode で高い同時実行性をサポートしたい場合は、アプリケーションのベンチマークを行う必要があります。しかしその場合は、おそらくシステムを再設計して、erlang が並行性に対処し、cnode を軽減できるようにする方がよいでしょう。

于 2011-01-17T22:04:20.417 に答える