3

これらはErlangでの私の最初のステップですので、この初心者の質問で申し訳ありません:)私が望むものではないすべてのRedisリクエストに対して新しいErlangプロセスを生成しています(32k Erlangプロセスで「プロセスが多すぎます」)が、どのようにスロットルするかプロセスの量を最大にします。16?

-module(queue_manager).
-export([add_ids/0, add_id/2]).

add_ids() ->
    {ok, Client} = eredis:start_link(),
    do_spawn(Client, lists:seq(1,100000)).

do_spawn(Client, [H|T]) ->
    Pid = spawn(?MODULE, add_id, [Client, H]),
    do_spawn(Client, T);

do_spawn(_, []) -> none.

add_id(C, Id) ->
    {ok, _} = eredis:q(C, ["SADD", "todo_queue", Id]).
4

4 に答える 4

6

Erlangpg2モジュールを使用してみてください。プロセス グループを簡単に作成でき、グループ内の「最も近い」(またはランダムな) PID を取得するための API を提供します。

eredisクライアントのプロセス グループの例を次に示します。

-module(redis_pg).

-export([create/1,
         add_connections/1, 
         connection/0,
         connections/0,
         q/1]).

create(Count) ->
    % create process group using the module name as the reference
    pg2:create(?MODULE),
    add_connections(Count).

% recursive helper for adding +Count+ connections
add_connections(Count) when Count > 0 ->
    ok = add_connection(),
    add_connections(Count - 1);
add_connections(_Count) -> 
    ok.

add_connection() ->
    % start redis client connection
    {ok, RedisPid} = eredis:start_link(),
    % join the redis connection PID to the process group
    pg2:join(?MODULE, RedisPid).

connection() ->
    % get a random redis connection PID
    pg2:get_closest_pid(?MODULE).

connections() ->
    % get all redis connection PIDs in the group
    pg2:get_members(?MODULE).

q(Argv) ->
    % execute redis command +Argv+ using random connection
    eredis:q(connection(), Argv).

上記のモジュールの動作例を次に示します。

1> redis_pg:create(16).
ok
2> redis_pg:connection().
<0.68.0>
3> redis_pg:connection().
<0.69.0>
4> redis_pg:connections().
[<0.53.0>,<0.56.0>,<0.57.0>,<0.58.0>,<0.59.0>,<0.60.0>,
 <0.61.0>,<0.62.0>,<0.63.0>,<0.64.0>,<0.65.0>,<0.66.0>,
 <0.67.0>,<0.68.0>,<0.69.0>,<0.70.0>]
5> redis_pg:q(["PING"]).  
{ok,<<"PONG">>}
于 2012-10-24T20:24:35.627 に答える
2

edis_poolなどの接続プールを使用できます。これはあなたにとって興味深いかもしれない同様の質問です。

于 2012-10-23T16:05:34.290 に答える
1

制限を実装するときは、基本的に「自分で」です。役立つツールはいくつかありますが、「あまりにも多くのプロセスを生成しないようにするにはどうすればよいですか?」という一般的な質問だと思います。まだ保持しています。秘訣は、どこかでプロセス数を追跡することです。

Erlang の慣用的な方法は、カウンターを含むプロセスを持つことです。新しいプロセスを生成したいときはいつでも、それに対してトークンの必要性を登録することによって、それを許可するかどうかを尋ねます。次に、カウント プロセスからの応答を待ちます。

カウントプロセスは、あなたのために制限を維持する素敵なモジュラーガイです.

于 2012-10-24T14:05:04.637 に答える