gpt4 book ai didi

exception - Erlang - 进程太多

转载 作者:行者123 更新时间:2023-12-05 01:16:36 28 4
gpt4 key购买 nike

这些是我在 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]).

最佳答案

尝试使用 Erlang pg2 module .它允许您轻松创建进程组并提供 API 来获取组中“最接近”(或随机)的 PI​​D。

这是 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">>}

关于exception - Erlang - 进程太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13033758/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com