Erlang:RabbitMQ源码分析 5. worker pool 实现分析

worker_pool 由一个worker_pool 和N个worker_pool_worker组成, N = number of scheduler threads

外部程序有两种方式来call worker_pool ,  submit(func) and submit_async(func)

submit(func) 是同步的提交Task,worker_pool 用worker_pool_worker做完返回

submit_async(func)是异步的提交Task,worker_pool 找个worker_pool_worker异步去做,如果没有worker_pool_worker就把Task加到Queue里

worker_pool是一个gen_server2的behavior,而且使用了hibernate和backoff,保证在没有Task request时候进入hibernate状态。

submit

submit是同步提交Task的方法,

1. 如果State里有available的worker_pool_worker,

1.1 monitor call submit的pid, 如果这个pid 意外退出,worker_pool_worker会收到request,在worker_pool_worker的handle_info里处理,避免有pid 意外退出,却没有释放worker_pool_worker

1.2 就把call submit的pid 放到worker_pool_worker的State里

1.3 停止monitor

1.4 run and reply

1.5 通知worker_pool,这个worker_pool_worker 空闲了

1.6 清空worker_pool_worker的State

2. 如果State里没有available的worker_pool_worker

2.1 把submit的Pid放到worker_pool的State的Pending Queue里

2.2 当1.5里worker_pool收到有worker_pool_worker 空闲了的通知,就返回这个worker_pool_worker 的pid

2.3 再重复1.1 - 1.6

submit_async

submit_async 是异步提交Task的方法 ,如果有available的worker_pool_worker,就直接异步run,run 完通知worker_pool 空闲。如果没有available的worker_pool_worker,就塞到worker_pool的State的Pending Queue里,但有worker_pool_worker空闲通知过来的时候,用这个worker_pool_worker异步去run

时间: 2024-10-12 22:56:41

Erlang:RabbitMQ源码分析 5. worker pool 实现分析的相关文章

[erlang]proc_lib源码浅析

源码位置位于安装目录的lib/stdlib/src下. 之前在使用gen_server时,由于之前自己实现过一个gen_server,因此对它内部的机制也能知道个七七八八,最近在用erlang的fsm模块,突然想读一读它得源码,这才突然发现erlang的源码内部还是做了很复杂的工作,尤其是有个"阴魂不散"的模块proc_lib. 无论是gen_server也好,gen_fsm也好,实际上在start的时候,都是调用的底层gen模块的start/start_link函数,由start函数

Apache Spark源码走读之6 -- 存储子系统分析

欢迎转载,转载请注明出处,徽沪一郎. 楔子 Spark计算速度远胜于Hadoop的原因之一就在于中间结果是缓存在内存而不是直接写入到disk,本文尝试分析Spark中存储子系统的构成,并以数据写入和数据读取为例,讲述清楚存储子系统中各部件的交互关系. 存储子系统概览 上图是Spark存储子系统中几个主要模块的关系示意图,现简要说明如下 CacheManager  RDD在进行计算的时候,通过CacheManager来获取数据,并通过CacheManager来存储计算结果 BlockManager

Netty源码学习——EventLoopGroup原理:NioEventLoopGroup分析

类结构图: 不了解Executor接口原理的可以查看concurrent包中的api介绍,这里只介绍Netty中EventExecutorGroup的主要功能! 从类的结构图中可以看到EventExecutorGroup是直接继承ScheduledExecutorService这个接口的,为了说明白Group的原理这里顺便提一下ScheduledExecutorService的用途! java.util.concurrent.ScheduledExecutorService An Executo

qemu-kvm-1.1.0源码中关于迁移的代码分析

Description Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or phrase. For example, you can call the University of Waterloo by dialing the memorable TUT-GLOP. Some

分析开源项目源码,我们该如何入手分析?(授人以渔)

1 前言 本文接上篇文章跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?,那么本篇文章再继续跟小伙伴们聊聊源码这个话题. 在工作之余开始写SpringBoot源码分析专栏前,跟小伙伴们聊聊"分析开源项目源码,我们该如何入手分析?"这个话题,我们就随便扯皮,反正是跟小伙伴们一起学习交流,没必要太正式. 小伙伴们看完本文后,若有自己的源码阅读心得可以在下面进行评论或私聊我进行分享,让我从小伙伴们身上GET多点源码阅读的一些技巧,嘿嘿. 2 学习开源框架源码到底难不难? 那么,先跟小伙

Erlang:RabbitMQ源码分析 3. supervisor和supervisor2深入分析

supervisor也是Erlang/OTP里一个常用的behavior,用于构建supervisor tree实现进程监控,故障恢复. 而RabbitMQ实现了一个supervisor2,我们从源码角度分析二者的实现和区别. 先介绍一些supervisor的基本概念,假设node_manager_sup是一个supervisor,它的init函数会定义supervisor的一些参数和它的children. 参数: 1. Restart Strategy: Strategy必须是simple_o

dubbo源码福彩快三平台搭建分析22 -- consumer 发送与接收原理

在前面福彩快三平台搭建论坛:haozbbs.com Q1446595067的文章中,我们分析了 dubbo 从 provider 进行服务暴露,然后把服务信息注册到注册中心上面解耦 consumer 与 provider 的调用.consumer 通过 javassist 创建代理对象引用远程服务.当通过代理对象调用远程服务的时候,讲到进行真正调用的时候 dubbo 抽象出集群容错(Cluster.Directory.Router.LoadBalance)从服务多个暴露方选取出一个合适的 Inv

加州大学用机器学习北京赛车(PK10)源码出售算法来预测和分析梦境

[导读]梦是神秘的一种主体经验,是哲学.宗教.心理学等最感兴趣的话题北京赛车(PK10)源码出售  QQ2952777280[话仙源码论坛]hxforum.com[木瓜源码论坛]papayabbs.com,也产生了许多有关的科学猜想.但人类从未真正理解梦的内容.机制和作用.我们能不能设计一种机器学习算法来预测和分析我们的梦境呢?答案是肯定的.在AI的帮助下,理解.预测和控制梦境的技术上已经取得了进展. 你有没有做过令人不安的梦,梦见高中时认识的某个人?或者做过以某种特殊的方式预知未来的梦,比如预

【Erlang】源码安装

Erlang介绍 Erlang(['?:l??])是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境. Erlang安装 环境: 系统:Linux(CentOS 7.2) java:1.8.0_181 ncurses:ncurses-6.1 (安装参照:[Linux] Ncures库的介绍与安装) erlang:otp_src_21.1.tar.gz 安装 1.下载源码包,地址:http://www.erl