七周七语言:Erlang Day 3

2024-02-13 18:58
文章标签 语言 day erlang 七周

本文主要是介绍七周七语言:Erlang Day 3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Erlang的重头戏来了--并发。还记得那句让人记忆深刻的话么:“就让他崩溃吧”。

  • 找可以在进程终止时重启它的OTP服务。

    在Erlang Doc 中可以看到OTP监督行为(Supervisor Behaviour)中的3种重启策略(Restart Strategy),翻译如下:

    1. one_for_one

      如果一个子进程终止了,那么只有那个终止的进程会被重启。

    2. one_for_all

      如果一个子进程终止了,那么所有同一级别的子进程都会被终止并且重启(包含那个终止的子进程)。

    3. rest_for_one

      如果一个子进程终止了,那么子进程集合中的“rest”部分--如终止的子进程之后的进程都会都会被终止并且重启。

    当然,关于重启服务的还有包括:最大重启频率、子进程规范等。该Doc中也给出了一个完整的例子:

    -module(ch_sup).
    -behaviour(supervisor).-export([start_link/0]).
    -export([init/1]).start_link() ->supervisor:start_link(ch_sup, []).init(_Args) ->{ok, {{one_for_one, 1, 60},[{ch3, {ch3, start_link, []},definitivelypermanent, brutal_kill, worker, [ch3]}]}}.
  • 找构建简单的OTP服务器的文档

    Erlang/OTP gen_server
  • 监视translate_service,并在它终止时重启它
    translate_service是在之前的时候写的一个并发程序,使用的是同步消息的机制。

    这里用到的就是OTP中的supervisor,用来监督子进程,而init(_)即是supervisor的回调函数。

    -module(translate_service).
    -behaviour(supervisor).
    -export([loop/0, translate/1]).
    -export([start/0]).
    -export([init/1]).
    -export([start_service/0]).loop() ->receive{From, "casa"} ->From ! "house",loop();{From, "blanca"} ->From ! "white",loop();% If the Word is not recognized, shutdown the process.{From, M} ->From ! "I don't understand.",exit({M, " Not Understand!"})
    end.% Add an atom(translator) to do the translation
    translate(Word) ->translator ! {self(), Word},receiveTranslation -> Translationend.start() ->io:format("Start translating program~n"),register(translator, spawn_link(translate_service, loop, [])),{ok, whereis(translator)}.% CALL BACK function
    init(_) ->{ok, {{one_for_one, 1, 60 },[{translate_service, {translate_service, start, []},permanent, brutal_kill, worker, [translate_service]}]}}.% Use the supervisor to monitor the service and keep it running.
    start_service() ->io:format("Start service~n"),supervisor:start_link(translate_service, []).

这一天的内容只完成了一个translate_service的supervisor,感觉还是对OTP里的内容的不了解。
Erlang的并发的强大之处恐怕也不止只是在可以很快的通过重启服务来做到“Let is crash”;其实Erlang的并发原语只有三个:spawn(create process), receive, !(send message, same as Scala),但是通过OTP这个“企业级”的库,却有着可以构建各式各样应用的函数;有点让人不快的是,习惯了一些语言之后,再来看Erlang那行末的", . ;"就会感觉很不适,其实感觉可以将这些不必要的终结符移除的;如果以后有机会的话应该还是会接触到Erlang这门为并发而生的语言。

参考:
  • Erlang Doc
  • Wakatta's Blog
  • Learn you som Erlang

转载于:https://www.cnblogs.com/iceCream/archive/2013/01/28/2880195.html

这篇关于七周七语言:Erlang Day 3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/706352

相关文章

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示