[elixir! #0017] Supervisor 究竟怎么用

news/2024/2/29 3:07:53

初学 Elixir, 我常常对 Supervisor 的概念感到疑惑. 没有Supervisor, 程序也能正常运行, 为什么还要加上这个东西呢? 原来, 这和 Erlang 的基本信条 —— “就让它崩溃” 有关, 在 Erlang 中, 是没有 try…rescue 这样的错误救援机制的. 取而代之的是 Supervisor 机制, Supervisor 是一个专门用来监督进程的进程, 每当它的名下有进程出错崩溃, Supervisor就会按照既定的策略重启进程.

我们将 Supervisor 名下的进程叫做子进程, 将由 Supervisor 和子进程所组成的监督网络称为 监督树. 有了监督树的帮助, 我们可以方便地构建一个高容错的应用.

这里要注意模块和进程的关系. 模块是函数的集合, 而类似 start_link 的函数可以创建进程,

那么, 如何在 phoenix 项目里使用 Supervisor 呢? ELixir 内置了两个模块: Supervisor 和 Supervisor.Spec.

Supervisor.Spec

我们可以这样设置 supervisor 名下的子进程:

import Supervisor.Specchildren = [worker(MyWorker, [arg1, arg2, arg3]),supervisor(MySupervisor, [arg1])   # 这个 supervisor 也是子进程
]Supervisor.start_link(children, strategy: :one_for_one)

Supervisor

这是以模块的方式配置 supervisor, 它包含了 import Supervisor.Spec:

defmodule MySupervisor douse Supervisordef start_link(arg) doSupervisor.start_link(__MODULE__, arg)  # 会调用 init 回调enddef init(arg) dochildren = [worker(MyWorker, [arg], restart: :temporary)]supervise(children, strategy: :simple_one_for_one)end
end

‘Supervisor.Spec`的主要函数

supervise(children, options) 会以tuple 的形式返回一个 supervisor配置.

supervisor(module, args, options \ []) 将给定的模块设置为一个 supervisor.

worker(module, args, options \ []) 将一个给定的模块定义为 worker.

Supervisor 的主要函数

count_children(supervisor)
返回一个清点子进程数的映射.
delete_child(supervisor, child_id)
通过子进程的id 删除其配置信息.
restart_child(supervisor, child_id)
通过 id 重启子进程.
start_child(supervisor, child_spec_or_args)
动态添加子进程配置信息, 并启动它.
start_link(children, options)
按给定的子进程启动一个 supervisor.
start_link(module, arg, options \ [])
按给定的模块启动一个 supervisor .
stop(supervisor, reason \ :normal, timeout \ :infinity)
停止 supervisor.
terminate_child(supervisor, pid_or_child_id)
终止子进程.
which_children(supervisor)
返回子进程列表.


https://www.jiucaihua.cn/news/show-3275237.html

相关文章

自定义 checkbox 新玩法 ?

自定义 checkbox 新玩法 ? 第一步:selector 编写 drawable/selector_checkbox_voice.xml <?xml version"1.0" encoding"utf-8"?> <selector xmlns:android"http://schemas.android.com/apk/res/android"><item android:drawab…

5.4 下午

艺术综合真题 学习Linux 转载于:https://www.cnblogs.com/bgd140206110/p/6809359.html

乐视视频唤不回“生机”

来源&#xff5c;猎云网编辑&#xff5c;盛佳莹反向营销根本难以去竞争长视频之战&#xff0c;终究只是一场昙花一现。2月6日晚间&#xff0c;乐视视频安卓版App 迎来9.24 更新&#xff0c;图标Logo换新&#xff0c;图标显示着“欠122亿”。安卓应用商城显示&#xff0c;乐视视…

QQ是成年人的“不老神仙水”

来源&#xff5c;燃次元编辑&#xff5c;冯晓亭很多人的青春&#xff0c;都与腾讯QQ紧密相连。“你上次登陆QQ是什么时候&#xff1f;”燃财经问了几位70后、80后乃至90后&#xff0c;仍有不少人回复&#xff0c;“我隔几天还会上QQ看一下&#xff0c;主要看有没收到新信息。”…

NPOI 表头、页眉页脚重复设置

NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的&#xff0c;它可以在没有安装Office的情况下对Word/Exc…

五部门联合约谈 特斯拉 “甩锅”习惯能改吗?

来源&#xff5c;雷达财经编辑&#xff5c;李万民2月8日&#xff0c;国家市场监管总局发布消息称&#xff0c;近日&#xff0c;市场监管总局与中央网信办、工业和信息化部、交通运输部以及应急管理部消防救援局&#xff0c;就消费者反映的异常加速、电池起火、车辆远程升级&…

使用adblock plus屏蔽开源中国的动弹

2019独角兽企业重金招聘Python工程师标准>>> 实在是受不了开源中国首页的动弹。和红薯也说了好多次&#xff0c;小编辑还要靠这个来活跃人气。整个开源中国的技术氛围被这些彻底的拉低了。红薯不同意&#xff0c;那就自己搞吧。 网上搜索了下&#xff0c;安装adbloc…

u-boot 编译时间

给定的格式FORMAT 控制着输出&#xff0c;解释序列如下&#xff1a; %% 一个文字的 % %a 当前locale 的星期名缩写(例如&#xff1a; 日&#xff0c;代表星期日) %A 当前locale 的星期名全称 (如&#xff1a;星期日) %b 当前locale 的月名缩写 (如&#xff1a;…

彻底“AI化”怎么样?

来源&#xff5c;脑极体编辑&#xff5c;海怪我们知道&#xff0c;美剧《西部世界》主要讲了一个“作为人工智能的接待员如何从被人类奴役的状态中觉醒&#xff0c;并最终反抗人类”的故事。这一主题其实是有些老套的。不过随着剧情展开&#xff0c;这些觉醒后的接待员闯入了人…

【转载】Java 内存分配全面浅析

转载在 http://blog.csdn.net/shimiso/article/details/8595564 本文将由浅入深详细介绍Java内存分配的原理&#xff0c;以帮助新手更轻松的学习Java。这类文章网上有很多&#xff0c;但大多比较零碎。本文从认知过程角度出发&#xff0c;将带给读者一个系统的介绍。 进入正题前…