一篇文章讲明白Erlangpoolmanagement

简介: 一篇文章讲明白Erlangpoolmanagement

上一篇已经分析了rpool 的三个module , 以及简单的物理关系. 这次主要分析用户进程和 worker_pool 进程还有worker_pool_worker 进程之间的调用关系. 在开始之前, 必须先明确一点, 就是一个worker_pool_worker 进程只有在处理完一个用户进程的任务之后才能开始处理另一用户进程的任务.

worker_pool 状态管理

在上一篇已经说明, worker_pool 管理了rpool 工作进程的ready idle busy 状态,从worker_pool 的代码可以看出, 对于idle 状态和busy 状态的处理逻辑是相同的.

1 handle_call({next_free, CPid}, _From, State = #state { available =

2 【WPid | Avail1】 }) ->

3 worker_pool_worker:next_job_from(WPid, CPid),

4 {reply, WPid, State #state { available = Avail1 }, hibernate}//代码效果参考:http://www.ezhiqi.com/zx/art_1766.html ;

以上是submit 请求在 available queue 不为空时的处理逻辑.

1 handle_cast({run_async, Fun}, State = #state { available = 【WPid | Avail1】 }) ->

2 workerpool worker:submit_async(WPid, Fun),

3 {noreply, State #state { available = Avail1 }//代码效果参考:http://www.ezhiqi.com/bx/art_4543.html , hibernate};

而以上是submit_async 请求在available queue 不为空时的处理逻辑.

1 handle_cast({idle, WPid}, State = #state { available = Avail,

2 pending = Pending }//代码效果参考:http://www.ezhiqi.com/zx/art_2650.html ) ->

3 {noreply,

4 case queue:out(Pending) of

5 {empty, _Pending} ->

6 State #state { available = ordsets:add_element(WPid, Avail) };

7 { {value, {next_free, From, CPid}}, Pending1} ->

8 worker_pool_worker:next_job_from(WPid, CPid),

9 gen_server2:reply(From, WPid),

10 State #state { pending = Pending1 };

11 { {value, {run_async, Fun}}, Pending1} ->

12 worker_pool_worker:submit_async(WPid, Fun),

13 State #state { pending = Pending1 }

14 end, hibernate};

当某工作进程完成对用户进程任务的处理之后, cast 给worker_pool 进程 idle 消息, worker_pool 会:

1, 判断pending 是否为空, 若空, 则将工作进程add 到available中;

2, 若pending 为 next_free, 则执行submit 请求时的处理流程;

3, 若pending 为run_async, 则执行submit_async 请求时的处理流程.

submit

用户进程在调用submit 请求时的基本流程如上图所示:

1, 用户进程call 请求 worker_pool 进程 next_free

2, worker_pool 进程 获取available 中的工作进程(PidA)并返回给用户进程

3, 用户进程call 请求PidA 工作进程submit

工作进程PidA 在ready 或 idle 时,工作进程的state 信息就会被置为undefined .

也就是在first message 到达工作进程时, 工作进程的state 信息为undefined, 那么工作进程处理上图first message 的逻辑为:

1 handle_cast({next_job_from, CPid}, undefined) ->

2 MRef = erlang:monitor(process, CPid),

3 {noreply, {from, CPid, MRef}, hibernate};

也就是 monitor 用户进程UPA, 并将自身的state 重置为 {from, CPid, MRef}, 然后等待UPA 进程的submit 请求, 也就是second message .

如果在这中间, UPA 异常退出, 工作进程就会收到{'DOWN' ... } message:

1 handle_info({'DOWN', MRef, process, CPid, _Reason}, {from, CPid, MRef}) ->

2 ok = worker_pool:idle(self()),

3 {noreply, undefined, hibernate};

然后将state 重置为undefined .

submit_async

用户进程在调用submit_async 请求时的基本流程如上图所示:

1, 用户进程cast 请求worker_pool 进程 run_async 参数是需要execute Fun

2, worker_pool 进程获取available 中的工作进程(PidA)并 cast submit_async 请求给PidA 参数为PidA 和 Fun

3, 然后进程在handle_cast callback 中进行处理.

1 handle_cast({submit_async, Fun}, undefined) ->

2 run(Fun),

3 ok = worker_pool:idle(self()),

4 {noreply, undefined, hibernate};

和submit 操作相比, 工作进程在处理submit_async 请求时,不需要monitor 用户进程(UPA), 不需要将Fun execute 执行的结果返回用户进程.

总结

在Mac 下omnigraffle 真的挺好用的,就是太贵了. :(

相关文章
|
SQL 存储 数据库
SQL语言易错面试题含答案
SQL语言易错面试题含答案
145 2
|
JSON JavaScript 前端开发
JavaWeb 速通JSON
JavaWeb——JSON 内容分享。
147 0
|
11月前
|
机器学习/深度学习 人工智能 算法
人工智能平台年度技术趋势
阿里云智能集团研究员林伟在年度技术趋势演讲中,分享了AI平台的五大方面进展。首先,他介绍了大规模语言模型(LLM)训练中的挑战与解决方案,包括高效故障诊断和快速恢复机制。其次,探讨了AI应用和服务的普及化,强调通过优化调度降低成本,使AI真正惠及大众。第三,提出了GreenAI理念,旨在提高AI工程效率,减少能源消耗。第四,讨论了企业级能力,确保数据和模型的安全性,并推出硬件到软件的全面安全方案。最后,介绍了整合多项核心技术的Pai Prime框架,展示了阿里云在自主可控AI核心框架下的整体布局和发展方向。
|
8月前
|
人工智能 自然语言处理
AudioX:颠覆创作!多模态AI一键生成电影级音效+配乐,耳朵的终极盛宴
AudioX 是香港科技大学和月之暗面联合推出的扩散变换器模型,能够从文本、视频、图像等多种模态生成高质量音频和音乐,具备强大的跨模态学习能力和泛化能力。
674 36
AudioX:颠覆创作!多模态AI一键生成电影级音效+配乐,耳朵的终极盛宴
|
前端开发 Java 数据库
SpringBoot返回枚举对象中的所有属性以对象的形式返回(一个@JSONType解决)
SpringBoot返回枚举对象中的所有属性以对象的形式返回(一个@JSONType解决)
961 0
向量的内积外积与其几何意义
向量的内积外积与其几何意义
979 0
|
消息中间件 网络协议 Dubbo
Netty是什么,为什么要使用Netty?
最近,也不知道什么原因,经常有粉丝问我关于Netty的问题。难道是大厂面试更卷了,开始关注更加底层的框架了?先不深究什么原因了,今天,我给大家分享一下什么是Netty,它能解决什么问题?
226 0
|
存储 SQL 缓存
MySQL中的Buffer Pool
介绍MySQL中的Buffer Pool中的知识
|
Cloud Native 大数据 Java
带你读《企业级云原生白皮书项目实战》——5.3.3 任务性能(5)
带你读《企业级云原生白皮书项目实战》——5.3.3 任务性能(5)
187 0
|
算法 Java C语言
顺序查找
顺序查找
189 0
顺序查找