首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我可以在Erlang中使用try catch时,为什么要使用supervisor?

当你可以在Erlang中使用try catch时,为什么要使用supervisor?

在Erlang中,try catch用于捕获和处理异常,但它只能处理局部的异常情况。而supervisor是一种用于监控和管理进程的机制,它可以在进程出现异常时进行自动的恢复和重启。

使用supervisor的主要原因有以下几点:

  1. 容错性:supervisor可以监控和管理多个进程,当某个进程出现异常时,supervisor可以自动重启该进程,确保系统的稳定性和可用性。这种容错机制可以有效地防止单个进程的崩溃对整个系统的影响。
  2. 可靠性:supervisor可以监控进程的状态,并在进程异常终止时进行重启。这种自动重启的机制可以确保系统的可靠性,减少人工干预的需求。
  3. 代码简洁性:使用supervisor可以将异常处理的逻辑从业务代码中分离出来,使得业务代码更加简洁和易于维护。业务代码只需要关注核心的业务逻辑,而异常处理和进程管理的工作交给supervisor来完成。
  4. 容易扩展:supervisor可以监控和管理多个进程,这使得系统的扩展变得更加容易。当系统需要处理更多的并发请求时,可以通过增加supervisor来管理更多的进程,从而实现系统的水平扩展。
  5. 高可用性:supervisor可以配置进程的监控策略,例如设置进程的重启次数和重启间隔。这样可以在进程频繁崩溃时,避免无限重启导致系统资源耗尽,从而提高系统的可用性。

总结起来,尽管Erlang中的try catch可以处理局部的异常情况,但使用supervisor可以提供更强大的容错和可靠性机制,使系统更加稳定和可靠。在开发Erlang应用时,建议结合使用try catch和supervisor,以实现全面的异常处理和进程管理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用正则表达式VS批量移除 try-catch

但需要注意的是,当 try-catch 嵌套,外部try-catch将无法对内部 try-catch 捕获的错误进行进一步的处理。...因此框架的使用,我理解的是:编写人员仅需要对可以考虑到的,可能出错的地方进行处理即可,而没必要每个方法都使用 try-catch 包裹——对于未考虑到的意外情况,统统扔给全局的异常处理即可。...操作 现在项目中几乎所有的方法都被 try-catch 包裹,为了将既有的代码try-catch 统一去除,我使用了如下的正则表达式 Visual Studio 2019 中进行替换(为了保险起见...image.png 说明 image.png 需要注意的有以下几点: \s 表示各种空白字符,包括换行等,因此可以用来匹配try-catch“两端”代码的空格 匹配包括空格的所有字符,应该使用...try-catch 的写法不同,仅保证对图示的写法有效 经过评论区的提醒,并不适用于嵌套try-catch的情况(会将原来的逻辑肢解),并且对于正常的try-catch也一并替换了,使用时应当先预览再操作

1.5K20
  • 广告行业那些趣事系列58:当我们面对文本分类任务的可以使用哪些优化策略

    摘要:本篇主要总结了一下我实际项目中对于文本分类任务的优化策略,主要包括预训练模型优化、语义embedding优化、分类层优化、使用知识蒸馏优化、使用标签内容信息优化、优化损失函数、通过半监督和主动学习优化...之前也做过一些文本分类的项目,这里刚好就作为一个总结吧:当我们面对文本分类任务的时候,可以使用哪些优化策略?...图2 知识蒸馏可以提供更多的暗知识 关于知识蒸馏的详细介绍可以参考我之前写过的文章:《广告行业那些趣事系列21:从理论到实战BERT知识蒸馏》 2.5 使用标签内容信息优化 我们还通过实验发现将文本分类任务转化成句子对匹配任务可以提升模型效果...初赛我们也遇到一个比较棘手的问题抛出来和大家一起分享,也就是训练集和测试集分布不同,具体现象是:官方提供了训练集,我们将训练集切分成train和val,使用train训练的模型val上效果非常好,但是提交进行评估发现在测试集上...本篇主要总结了一下我实际项目中对于文本分类任务的优化策略,主要包括预训练模型优化、语义embedding优化、分类层优化、使用知识蒸馏优化、使用标签内容信息优化、优化损失函数、通过半监督和主动学习优化

    35410

    代码结构的演进

    所以为了尽可能让某个局部的错误不至于影响全局,大家一致的做法是defensive coding —— 甭管谁的代码引起的问题,反正问题不能出在我这里,try catch也好,if error check...可程序员们还在呼唤更好的解决之道:既然静态的代码可以用树状的层级结构来管理,为什么运行时的代码不能采用同样的方式呢?...erlang,actor则相当于软件的细胞。若干个细胞结合起来,成为软件的组织;若干组织结合起来,成为软件的器官,然后再结合成整套软件。这种软件的组合模式看上去像是这样: ?...这部分保证足够健壮,不会出问题。erlang里,这被称为error kernel。软件的撰写者分辨出软件的哪部分是一定不能出问题的,一旦出问题,软件就得crash。...过去二十年在企业的应用远远广于beam),并且做得更彻底一些(erlang的actor可以选择是否supervise,akka所有actor都会被parent supervise)。

    1.1K50

    分布式系统的监工:Overseer

    使用者需要在 pull request 里升级版本(才能生成一个 build)。因此,多个开发者间需要在 pull request 把版本错开,很不方便。...当构建繁忙的时候,队列后面的请求很久才能排到(Latency 不友好)。 所以我要在下一个版本,将这些问题解决。...这样启动起来之后,就能自动处理构建任务 描述构建任务的 metadata 放置于 spot instance 启动的 user data ,构建软件通过 http://169.254.169.254...然而,erlang/OTP 里的 Supervisor 只负责启动和监控 process,如果启动和监控 node,有很多问题: 如何在 cloud 里动态启动一个节点?...2 我们上文中提过 —— 我们可以通过给新启动的 instance 提供 UserData 来解决 —— AWS 里,当我们启动一个新的 instance,可以预设一些 json 数据进去,本地访问

    98670

    EMQ百万级MQTT消息服务(介绍和搭建)

    先上节了解完MQTT之后我们需要选择一个MQTT服务端,MQTT官方推荐下找了找最后选择了使用EMQ来进行服务端实现,EMQ有什么优势可以官方推荐的那么多的服务器实现脱颖而出,本章就来和大家一起慢慢了解...有可视化dashboard管理能够对链接状态消费情况进行监控 2.安装EMQ 这里使用的是Centos.7.4版本(如果是其他系统可以去官方文档寻找对应的软件包) > yum -y install unzip...[ok] emqttd session supervisor is starting...[ok] emqttd wsclient supervisor is starting......[ok] emqttd mod supervisor is starting...[ok] emqttd bridge supervisor is starting......> emqttd_ctl status Node 'emq@127.0.0.1' is started emqttd 2.3.5 is running 3.使用EMQ 当我们启动了EMQ之后就可以使用客户端进链接了

    2.8K50

    深入解读RabbitMQ工作原理及简单使用

    RabbitMQ简介 介绍RabbitMQ之前实现介绍一下MQ,MQ是什么? MQ全称是Message Queue,可以理解为消息队列的意思,简单来说就是消息以管道的方式进行传递。...使用场景 我们秒杀抢购商品的时候,系统会提醒我们稍等排队,而不是像几年前一样页面卡死或报错给用户。...为什么选择RabbitMQ 现在的市面上有很多MQ可以选择,比如ActiveMQ、ZeroMQ、Appche Qpid,那问题来了为什么选择RabbitMQ?...当你把消息发送到Rabbit服务器的时候,你需要选择你是否进行持久化,但这并不能保证Rabbit能从崩溃恢复,想要Rabbit消息能恢复必须满足3个条件: 投递消息的时候durable设置为true...不然会出现Rabbit安装之后启动不了的情况,理论上卸载的顺序也是先RabbitErlang

    4.6K21

    Let it crash: 因为误解,所以瞎说

    不过我倒是写了两千行在生产环境中使用的 elixir 代码,还有几千行将要被应用在生产环境,所以自认为对 elixir 算是略懂一二。...为什么实现 let it crash 很困难? erlang VM 为了支持 let it crash,即便够不上呕心沥血,也对得起殚精竭虑四个字了。...简言之,一个 process 启动,和一个已有的 process link 起来,这样,其中的一方 crash 了,另一方得到通知,然后进行必要的处理。...你可以使用一个 process 来「管理」 ets table(设置这个 process 为 heir),当 worker 启动,把 table 移交给 worker,当 worker crash ...这是 erlang / OTP 整个体系漫长的发展过程逐渐完善出来的;是将 let it crash 真正作为一种思想后,各种问题,各种需求的催化下,衍生出来的功能。

    1.4K70

    关于Java异常Exception最常见的十大问题1 受检异常 VS 非受检异常2 异常管理的最佳实践3 为什么try语句中定义的变量不能在catch和finally语句中使用?4 为什么Doubl

    非受检异常是由哪些程序编译不能被解决的问题所引起的,常见的有除以0,空指针等等。 受检异常非常重要,因为你希望其他使用你的程序API的开发者知道如何去处理这些异常。...Paste_Image.png 2 异常管理的最佳实践 如果一个异常能够被正确的处理,那么他就该捕获,反之,则该被抛出 3 为什么try语句中定义的变量不能在catch和finally语句中使用?...The code does not pass compilation 下面这段代码,string s定义try语句块,然后却在catch语句中使用了s,这段程序是无法通过编译的 try {...语句块的exception会在哪里被throw出去,比如这个例子,我们知道如果抛出FileNotFoundException,也是头两句代码,那么如果跑出了异常,异常产生地方,其后的代码都不会被执行...这就是为什么try语句中定义的变量不能在catch和finally语句中使用

    1.1K41

    Actor模型

    为什么保持共享数据的正确性呢? 无非是因为程序是多线程的,多个线程对同一个数据操作若不加入同步条件,势必造成数据污染。 那么为什么不能使用单线程去处理请求呢?...Erlang,每段代码都运行在进程,进程是Erlang对Actor的称呼,意味着它的状态不会影响其他进程。系统中会有一个supervisor,实际上它只是另一个进程。...例如:将计数器场景基于线程的实现替换为Actor,当然Actor也要在线程运行,但Actor只在有事情可做(没有消息处理)的时候才会使用线程。...初始购买操作CustomerActor需要发送一个消息给TicketsActor,消息包含了购买的数量。当TicketsActor接收到消息时会校验购买数量是否超过库存数量,若合法则递减数量。...Actor可能会堵塞自己但Actor不应该堵塞自己运行的线程 Actor参与者 Actor Actor的概念来自于ErlangAKKA可以认为一个Actor就是一个容器,用来存储状态、行为、邮箱

    82910

    当我参加培训的时候,我在学什么?

    这个培训使用的 exercise 非常经典,从 gen_server,gen_fsm,gen_event,一路练习到 supervisor,application,以及使用 sasl 深入了解 release...你看我都问了哪些很 "silly" 的问题: 为什么说 start_link 是个同步的过程? application 为什么会起两个 process,再启动 supervisor?...(我觉得我懂了,但我不知道我是不是真的懂了) 使用 global process 是不是个好的做法(这次我干脆无耻地打开我工作写的 auto compiler 的代码跟他探讨) 我这样这样这样用 ansible...是不是可以趁着这样的机会把自己工作遇到的问题,不懂的,似懂非懂的,以为自己懂的,以为自己对的,都拎出来跟讲师辩一下呢?...用这样的机会跨越平台期 程序员估计都知道一万小理论 —— 足够长时间(一万是个约数)某个领域的刻意训练(deliberate training)能够让你成为专家。

    70150

    搭建RabbitMQ消息服务,整合SpringBoot实现收发消息

    消息队列,消息发送者将消息发送到队列,而消息接收者则从队列获取消息进行处理。消息队列提供了一种异步的通信方式,即发送者发送消息后不需要等待接收者的回复,而可以立即继续执行其他操作。...同时,消息队列还可以实现消息的持久化存储,确保消息发送和接收过程的可靠性。...消息队列的应用场景非常广泛,例如: 分布式系统可以用消息队列来实现不同模块之间的解耦; 高并发系统可以利用消息队列来缓解系统压力; 实时数据处理可以将数据存储消息队列,再由数据处理模块进行处理...1.3 为什么需要用到 RabbitMQ 解耦:RabbitMQ通过消息队列实现了生产者和消费者的解耦。生产者将消息发送到队列,而消费者从队列获取消息并进行处理。...因为我们要把 RabbitMQ 服务装在服务器上,所以同学们可以服务器上下载 Erlang 安装包,或者下载后手动上传至服务器。

    71320

    上帝说:要有一门面向未来的语言,于是有了 erlang

    对于 erlang 来说,我们可以通过唯一的 pid 来定位到目标 process,就像打电话直播电话号码;我们也可以通过和 pid 一一对应的名字来定位到目标 process,就像你背不下来程序君的手机号但可以从手机地址簿里调出呼叫一样...是不可能的,想想看,这里为什么可以?)。...我们知道,reference 是有代价的 —— 这个 binary 记录 refcnt,对「收看」和「看过」的行为增增减减,保证 binary 不会在 consumer 还未使用前就被释放,同时也要保证...为了更好的 load balance,scheduler 无事可做可以去别的 scheduler「偷」 run queue 里的 process 过来运行;同样的, run queue 过长 scheduler...supervisor 我在上文中,以及曾经有篇并不太严谨的 Let it crash: 因为误解,所以瞎说 一文略有涉及。 application 我 谈谈边界(Boundary) 一文中提及。

    1.4K110

    Service 层异常抛到 Controller 层处理还是直接处理?

    这一般就是程序员的bug: 要不就是程序员想表达一个东西”没有“,结果在后续处理忘判断是否为null 要不就是写代码觉得100%不可能为null的地方出现了一个null 不管哪种,这错误用户总会看到一个很含糊的报错信息...5 提升维度 一个工作线程的“外部容器“是管理工作线程的“master” 一个网络请求的“外部容器”是一个Web Server 一个用户进程的“外部容器”是[操作系统] Erlang把这种supervisor-worker...svc这层是不用处理任何异常,因此不写[try……catch]天经地义。但实际上doStep1、doStep2、doStep3任何一个抛异常都会造成svc的数据状态不一致。...8 总结 对错误处理要有敬畏之心: Java因为Checked Exception设计问题不得不避免使用 而Uncaughted Exception实在弱鸡,不能给程序员提供更好帮助 因此,程序员每次抛错或者处理错误的时候都要三省吾身...[编译器]不能帮上太多忙,好好写UT来保护代码可怜的正确性。 请多写正确的代码!

    27520
    领券