gpt4 book ai didi

multithreading - "How many links do I have?",询问 Erlang 进程

转载 作者:行者123 更新时间:2023-12-04 01:54:45 25 4
gpt4 key购买 nike

Erlang 中的进程将调用 link/1spawn_link 来创建与另一个进程的链接。在我最近正在研究的一个应用程序中,我很好奇一个进程是否有可能在给定实例上知道它所链接的其他进程的数量。这可能吗 ?他们是 BIF 吗?

然后,当一个链接进程死亡时,我猜如果可以知道链接进程的数量,这个数字将由运行时系统自动递减。这种机制非常适合处理 Erlang 并发程序中的 Parent-Child 关系,即使在不涉及 supervisors 的简单程序中也是如此。

嗯,Erlang 进程是否有可能通过 BIF 知道 out-of-the-box 链接到它的进程的数量,这样每当一个链接的进程死亡时,这值会自动减少 under-the-hood :)?


为了稍微扩展这个问题,考虑一个 gen_server,它将通过 handle_info 处理数千条消息。在这部分中,它的工作是dispatch子进程在任务进入后立即处理。这样做的目的是确保server loop立即返回到接受下一个请求。现在,子进程异步处理任务,并在请求者死亡之前将回复发送回请求者。请引用此question及其答案,然后再继续。

现在,如果为每个由 gen_server 生成的子进程创建一个链接,我想用这个链接作为计数器。我知道,我知道,每个人都会像“为什么不使用 gen_server State 来携带一个计数器,然后相应地增加或减少它?” :) 在 gen_server 的某个地方,我有:

handle_info({Sender,Task},State)->
spawn_link(?MODULE,child,[Sender,Task]),
%% At this point, the number of links to the gen_server is incremented
%% by the run-time system
{noreply,State};
handle_info( _ ,State) -> {noreply,State}.

child 继续这样做:

child(Sender,Task)->
Result = (catch execute_task(Task)),
Sender ! Result,
ok. %% At this point the child process exits,
%% and i expect the link value to be decremented

最后,gen_server 有一个这样的公开调用:

get_no_of_links()-> gen_server:call(?MODULE,links).
handle_call(links, _ ,State)->
%% BIF to get number of instantaneous links expected here
Links = erlang:get_links(), %% This is fake, do not do it at home :)
{reply,Links,State};
handle_call(_ , _ ,State)-> {reply,ok,State}.

现在,有些人可能会问自己,真的,为什么有人要这样做?

通常可以在 gen_server State 中创建一个整数,然后我们自己做,或者至少让 {'EXIT',ChildPid,_Reason} 类型的 gen_server handle_info 然后服务器将采取相应的行动。我的想法是,如果可以知道链接的数量,我会用它来知道(在给定的时间)有多少子进程仍在忙于工作,这反过来实际上可能有助于预测服务器负载。

最佳答案

来自 process_info 的手册:

{links, Pids}: Pids is a list of pids, with processes to which the process has a link

3> process_info(self(), links).
{links,[<0.26.0>]}
4> spawn_link(fun() -> timer:sleep(100000) end).
<0.38.0>
5> process_info(self(), links).
{links,[<0.26.0>,<0.38.0>]}

我猜它可以用来计算链接进程的数量

关于multithreading - "How many links do I have?",询问 Erlang 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13801182/

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