a simple erlang process pool analysis

[Erlang]link进程信号详解 原创文章,转载请注明出处:服务器非业余研究http://blog.youkuaiyun.com/erlib 作者Sunface联系邮箱:cto@188.com估计很多同学都会对link时各种信号及捕捉机制有点迷糊,我这边在画一个表格,特分享给大家ReasonTrapping exits (trap_exit = true)Not trapping exits (trap_exit = false)normal 阅读详情

a simple erlang process pool analysis

这是一个简单的erlang进程池分析,是learn you some erlang for Great Good 里面的一个example,详细的内容可到官网查看!

主要的流程图

 ppool flower

实现原理

这个的例子的实现原理官网都有比较详细的说明,主要模块在ppool_serv中,ppool_serv是一个gen_server behaviour, 而ppool_sup 是一个one_for_all的策略,如果ppool_serv或者worker_sup出现问题,彼此也没有存在的必要了。

这里ppool_serv 和 worker_sup的实现,使用了一个简单的技巧,因为worker_sup不是ppool_sup直接调用生成的,它是由ppool_serv控制生成的:

%% Gen server
init({Limit, MFA, Sup}) ->
    %% We need to find the Pid of the worker supervisor from here,
    %% but alas, this would be calling the supervisor while it waits for us!
    self() ! {start_worker_supervisor, Sup, MFA},
    {ok, #state{limit=Limit, refs=gb_sets:empty()}}.

woker_sup由ppool_serv自己在init函数中,发给自己一个Message,然后在回调函数中才生成:

handle_info({start_worker_supervisor, Sup, MFA}, S = #state{}) ->
    {ok, Pid} = supervisor:start_child(Sup, ?SPEC(MFA)),
    link(Pid),
    {noreply, S#state{sup=Pid}};

如果他们一起直接生产,那么会产生死锁,

当然,他这里的生成顺序,可以自己修改一下,也不会出现死锁。


gen_serv的主要数据结构

-define(SPEC(MFA),
        {worker_sup,
         {ppool_worker_sup, start_link, [MFA]},
          temporary,
          10000,
          supervisor,
          [ppool_worker_sup]}).

-record(state, {limit=0,
                sup,
                refs,
                queue=queue:new()}).

?SPEC(MFA), 这里的MFA指明一类Task,所以同一个ppool_worker_sup,不会有不同类型的Task,它的策略也是simple_one_for_one.

在这个例子中,使用了一个gen_server -- nnager module 作为Task,这个Task的参数为:{Task, Delay, Max, SendTo}, Task标示任务名字,Delay作为超时时间,只是标示这个任务是有超时限制的,也是一个调试技巧,Max为最大超时次数,SendTo用来发送信息给回调进程,这个进程可以是shell, 如果是shell,flush()就会收到信息。

record 用来标识一些主要的信息,Limit为进程池的大小限制,sup开始为ppool_sup的pid(),在生成woker_sup进程后,就变成worker_sup的进程pid(),因为ppool_serv的主要交流对象还是worker_sup和worker(Task); refs(gb_set)为woker的进程链接,这样可以在worker进程down掉或者done时,从线程池中剔除掉;queue为任务队列,当任务大于limit时,就把多余的任务放到queque中,等到进程池有空闲时,就从中pop出任务,接着处理。

这里有些局限的地方:1.每次的任务都是新建的进程去处理,就是说进程的生命周期跟任务的生命周期是一样的,可以把进程跟任务分离出来,让进程不随任务的结束而结束(当然这的任务就不要是gen_server,gen_fsm这些,因为这些也是spawn出来的进程),这样进程开销理论上一次初始化就行了,虽然进程在erlang中开销比较少;2.队列没有大小限制

【信息科学与工程学】【通信工程】第五十九篇 IP网络设计01 IP网络设计不是只写ip address;它本质是的问题,所以参数天然分布在:层级例子物理/传输(可选但你会要求光路/电路)光功率/OSNR/色散/衰减/BER/FEC;铜/微波链路预算L1/L2 链路模型速率、MTU、成帧开销、串行化、传播时延、缓冲排队/调度/QoS服务曲线、令牌桶、延迟界、丢包概率近似路由/TE/可靠性流守恒、路径容量、切换/收敛时间信息论/可达性Shannon 上限、FEC 有效码率、链路容量 after overhead计算科学/数值。 阅读详情

相关推荐

poolboy erlang

poolboy erlang 线程池 一个用erlang写的pool库

关于erlang的进程池

有两种情况需要考虑使用进程池管理erlang进程。 一种是普通erlang进程,很便宜,一次可以并行很多(默认32K,当然可以调整vm参数设置更大),但是这不意味着可以无限制的使用,实际上轻松的达到上限是很容易的(想想发明国际象棋的那位向国王请赏的办法,类似的,一个进程开两个,两个再开四个,四个再开8个。。。。,很容易就达到了上限),因此有时候我们需要对进程进行管理,避免无限制的使用累垮系统...

好记性不如烂博客 471

伪距单点定位算法原理以及利用最小二乘法计算实例

即该公式:建立下列代价函数满足最佳估值的条件为:即:可解得未知参数 X 的最佳估值由于每个可见卫星观测量的精度可能不一样,这时,需要对不同观测量赋予一个权重系数,称为加权。

qq_43381998的博客 1万+

Erlang进程池(整理)

关键字:Erlang,进程池,开源 1.情景     项目中有很多连接zookeeper的地方,都是各自连接,保存pid或者monitor,并在terminate或DOWN的时候对连接进行关闭或者重连。可以考虑采用Erlang进程池,对进程进行统一管理。     2种需要采用进程池的情景:     1.大量的普通Erlang进程:虽然vm默认可以创建很多,笔者的机器可以创建大概2w个进程(

北蔡的代码世界 1999

《玩儿起来吧》MATLAB 实时图像处理系列(一二三四)

大家学了图像处理之后,是不是就想学以致用。而要用于生活中,最好的方式就是和摄像头搭配,实现实时图像处理。今天就给大家分享MATLAB实时图像处理的基础方法,希望能帮你快速入门。

HPC_ZY 1万+

Vue 10分钟入门VR全景显示 基于photo-sphere-viewer

文章目录前言一、引入photo-sphere-viewer?二、使用步骤1.引入库2.声明容器3.内容加载4.全部代码总结 前言 由于工作的需求,要实现全景图片的展示与预览,本来以为会是一个很难的内容,没想到使用现成的组件photo-sphere-viewer就可以轻松实现,上手只需要10分钟! 一、引入photo-sphere-viewer? 可以直接通过npm进行引入 npm install photo-sphere-viewer 二、使用步骤 1.引入库 photo-sphere-viewer

YIGE_MO的博客 5866

PoolBoy

PoolBoy  source code : https://github.com/devinus/poolboy Checkout ready({checkout, Block, Timeout}, {FromPid, _}=From, State) -> #state{supervisor = Sup, workers = Wo

Riak, Spark, Golang, Erlang, 云存储, 云计算, 数据挖掘 3399

从配置字到实际运动:手把手教你用EtherCAT调试伺服电机的控制模式(以倍福TwinCAT3为例)

本文详细介绍了如何使用EtherCAT调试伺服电机的控制模式,以倍福TwinCAT3为例。从环境搭建、模式配置到状态机切换,提供了完整的操作指南和典型故障排查方法,帮助工程师快速解决‘配置字写入了但电机不转’等常见问题,提升工业自动化现场的调试效率。

weixin_42783709的博客 421

Clojure

#Clojure 在Clojure中,任何函数调用都需要用括号将其包起来。括号里 的第一个元素是函数名,剩下的是参数。 user=> ( println "Give Me Some Clojure!") Give Me Some Clojure! nil user=> (-1) ClassCastException java.lang.Long cannot be cast to c

Riak, Spark, Golang, Erlang, 云存储, 云计算, 数据挖掘 3389

水下井口装置及钻杆建模

内容:海上油气资源开采的过程中,通常会由海上钻井平台下入钻杆连接到海底井口装置。OrcaFlex软件可进行各种海洋工程结构动态分析,通过各项数据的输入,能够很方便地进行水下井口装置及钻杆建模。直接使用软件New Line及new vessel功能,再设置模型的各项参数(几何属性、弯曲刚度、轴线刚度、扭转刚度、泊松比等)即可建成井口装置及钻杆模型。 设置管线的几何属性:主要包括管线的内外径、壁厚、...

s0302017的博客 1145

代谢组数据分析(二十四):基于tidymass包从质谱原始数据到代谢物注释结果的实践指南

本教程介绍了如何使用 R 语言中的 tidymass 包进行代谢组学数据分析。tidymass 是一个专为液相色谱-质谱(LC-MS)数据设计的开源工具,提供从数据准备到统计分析的全流程支持。教程详细讲解了数据准备、数据处理、数据探索、数据清洗、代谢物注释、统计分析及结果输出的步骤。用户需准备 MS1、MS2 数据和样本信息表,并通过 tidymass 进行峰识别、峰分组、保留时间校正等操作。数据处理后,用户可进行数据探索、清洗和代谢物注释,最终通过统计分析发现潜在的生物标志物,并输出结果。教程还提供了代码

专注生信领域 1635

cowboy 基础使用

Cowboy Initialization 首先, init函数会被调用,所有的处理都会调用该函数。如果使用rest处理当前的请求,那么这个函数必须返回upgrade [init({tcp, http}, Req, Opts) -> {upgrade, protocol, cowboy_test}. cowboy会转为REST协议来开始执行状态机,如果rest_init

Riak, Spark, Golang, Erlang, 云存储, 云计算, 数据挖掘 3038

康复训练监测系统:基于YOLOv8的患者动作规范识别

本文系统介绍了基于YOLOv8的康复训练动作规范识别系统,从理论背景、数据准备、模型训练、推理应用到UI界面,提供了完整技术链条及代码示范。希望对康复领域的智能监测应用提供参考和借鉴。

YOLO 453

elixir quote, macro

Quote , quote and Macro 1 引用与去引用 elixir可以被自己的数据结构表示出来。在这一章,我们将会学习到这种数据结构是怎样子的,该如果去撰写它们。这一章的学习跟宏有关,下一章我们将会更深入的学习。 1.1 引用 elixir代码块用三元素的元祖来表示。列如sum(1, 2, 3)函数调用,内部可以表示为: {:sum, [], [1

Riak, Spark, Golang, Erlang, 云存储, 云计算, 数据挖掘 2747

含分布式光伏的IEEE 33节点配电网电压越限仿真分析

摘要 本文针对分布式光伏接入配电网引发的电压越限问题,基于IEEE 33节点系统开展仿真研究。首先分析了光伏出力的随机性和波动性特性,采用Beta分布和马尔可夫链方法建立光伏出力模型;其次在MATLAB/Simulink平台搭建完整测试系统,包含光伏模型、配电网线路模型和控制模块;最后通过多场景仿真定量分析了不同光伏渗透率和接入位置对节点电压的影响。结果表明:光伏渗透率提高会显著增加电压越限风险,特别是线路末端节点;光伏接入位置对电压分布具有决定性影响,馈线末端接入更易引发电压越限。研究为含高比例光伏的配电

huanghm88的专栏 321

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

erlang 并发编程

最近上班比较忙,没时间学习erlang ,实在对不起自己啊,以前一直在找erlang相关的教程,终于找到一个了,这个网站是前几天才开始运行的,以后的文章可能都是来自于那里,网站是http://www.erlang-cn.com ,大家忙没事多学习! 并发编程一: -module(tut15). -export([start/0,ping/2,pong/0]). ping(0,Pong_

Riak, Spark, Golang, Erlang, 云存储, 云计算, 数据挖掘 1864

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

erlang 之时钟

今天来看一下erlang中的时钟如何实现的: -module(timeout). -export([sleep/1,flush_buffer/0]). %%%睡眠函数 sleep(Time) -> receive after Time -> true end. %%%清空邮箱 flush_buffer() -> receive AnyMessage ->

Riak, Spark, Golang, Erlang, 云存储, 云计算, 数据挖掘 1858

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

erlang 之 echo 服务器

简单实现了一个echo 服务器 -module(echo). -export([start/0,loop/0]). start() -> Pid = spawn(echo,loop,[]), Pid ! {self(),'Hello Word'}, receive {Pid,Msg} -> io:format('~w~n',[Msg]) end, Pid ! st

Riak, Spark, Golang, Erlang, 云存储, 云计算, 数据挖掘 1606

erlang 之简单密码加密

这些程序主要是来之 连城 翻译的一个书里面的代码 -module(encode). -export([encode/2]). encode(Pin.Password) -> Code = {nil,nil,nil,nil,nil,nil,nil,nil,nil, nil,nil,nil,nil,nil,nil,nil,nil,nil, nil,nil,nil,nil,nil,n

Riak, Spark, Golang, Erlang, 云存储, 云计算, 数据挖掘 1354

erlang 之简单的Diction实现

最近在看学erlang ,看到了字典这个demo ,把程序Copy出来和大家分享一下 -module (diction). -export([new/0,lookup/2,add/3,delete/2]). new() -> []. lookup(Key , [{Key,Value}|Rest]) -> {value,Value}; lookup(Key,[Pair|Rest])

Riak, Spark, Golang, Erlang, 云存储, 云计算, 数据挖掘 1200

erlang -- timeout 的简单使用

今天晚上有点晚了,不过还是坚持每一天写一个程序! 下面的时超时器 :        建设A要想db进程发送一个信息,然后在规定的时间内等待消息的返回,那么A可以设置一个超时器,注意的是在发送消息之前,得先清空消息队列,要不然等译接到的消息可能db还没发送之前的了 read(Key) -> flush(), db | {self(),{read,Key}}, receive {re

Riak, Spark, Golang, Erlang, 云存储, 云计算, 数据挖掘 1164

erlang 基础

Erlang变量 在Eelang中一个变量的范围是在相同函数中变量被绑定后的任意位置。 Case unsafe(X) → case X of one → Y = true ; _ → Z =false ; end, Y. 这是一种不好的变成习惯。Y可能没有被定义。下面是安全使用变量的理想方法,对应的变量只绑定一次,而变量的值由一个case语句决定。 Case 是一种匹配的方

Riak, Spark, Golang, Erlang, 云存储, 云计算, 数据挖掘 1081

erlang 简单的树操作

下面是一个简单非平衡的二叉树的操作 -module(tree). -export([test1/0]). lookup(Key,nil) -> not_found; lookup(Key,{Key,Value,_,_}) -> {found,Value}; lookup(Key,{Key1,_,Smaller,_}) when Key lookup(Key,Smaller); l

Riak, Spark, Golang, Erlang, 云存储, 云计算, 数据挖掘 1078
上一篇: a little riak book
下一篇: avl树 golang实现
laohan_
博客等级 码龄15年 112粉丝 224原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值