Erlang(一)

erlang是不像C语言面向过程,也不像C++面向对象,它是一门面向进程的语言,erlang是一个平台,是一种模拟器,是一种介于操作系统和应用程 序之间的状态,所以erlang参数也有两种,一种是控制模拟器的参数,一般以“+”为开头;一种是控制应用程序的参数,以“-”开头,这个以后会讲到。
erlang有5个核心概念和特征:
1、并发编程
什么是并发?并发简单的说就是无须以特定顺序执行的事物,如果硬件允许,那么进程可以同时执行,如果硬件不允许,则交替执行,进程与进程之间相互独立且执行没有顺序之分,这样就是并发。
erlang
的一大优势就是它帮你隐藏了任务实际执行的细节,如果有额外的CPU,erlang会利用他们并行执行更多并发任务,如果没有,erlang会利用现有的
CPU处理能力一点一点的交替执行任务,你不必操心这些细节,erlang程序能够自动适配不同的硬件——CPU越多她们跑的越快,当然,前提是任务的组
织方式允许它们被并发执行。
在erlang中,并发的基本单位是进程,每个进程是某段程序代码的执行代理,与其他的进程一起并发运行,相互独立,互不影响,以确保自身内部状态的改变不对其他进程造成影响。
erlang进程不像很多其他的语言和操作系统中的线程一样,共享相同的内存空间,erlang进程拥有自己的工作内存空间和自己的信箱,其中信箱用于存放外来信息。

于进程之间互不共享内部状态,它们只能进行复制式通信,一个进程要跟其他进程交换信息,就会发送一条信息,这条信息是发送方所持有数据的一个只读副
本,erlang的进程间的通信机制总会让接收方获取一份私有的消息副本,即使消息收发双方同处在一台机器上,这就意味着网络编程和单机编程完全一样!

息传递一般可分为两类:同步方式和异步方式。在同步方式下,消息抵达接收端之前发送方什么事也做不了;在异步方式下,消息一经投递发送方便可立即着手其他
事务,同步很容易用异步实现,令接收方总是向发送方回传一个显式的回复即可。因此,erlang中的消息传递原语是异步的。
当然,收发双发在这一
层面的隔离并不是免费的,复制大型数据结构时成本很高,如果发送方还要保留数据副本,势必造成较高的内存消耗,在实践中,这意味着你必须在发送消息是小心
掌控消息的大小和复杂度,不过一般来说,地道的erlang程序用到的大部分消息都比较小,复制开销通常可以忽略。
在开发erlang程序时,首先要想那些活动是可以并发的,或者说那些活动可以彼此相互独立地进行,然后将一个复杂的运算切分为若干并发部件,再全部建模为独立的进程,启动运算、派生进程、处理数据,在进程完工后,它的工作内存、信箱和其他资源都会自动回收。
2、容错
erlang
进程意外退出时,会产生一个退出信号,所有与濒死进程链接的进程都会收到这个信号,默认情况下,接受方会一并退出并将信号传播给与它链接的其他进程,直到
所有直接或间接链接在一起的进程统统退出为止,这种级联行为可以使一组进程像单个应用一样退出,因此系统整体重启时你不必担心是否还有残存下来未能完全关
闭的进程。
erlang容错哲学简单说就是“鼓励崩溃”,精准记录下事发位置和经过后,把一切彻底抛下重新再来。
OTP实现容错的主要途
径之一就是改写退出信号默认的传播行为。通过设置trap_exit进程标记,你可以令进程不再服从外来的退出信号,而是将其捕捉,这种情况下,进程接受
到信号后,会先将其转为一条格式为{‘EXIT‘,Pid,Resson}的信息,该信息描述了哪个进程出于什么原因而发生故障,然后这条消息会像普通消
息一样被丢入信箱,捕捉到信号的进程就能分检并处理这类消息了,这类会捕获信号的进程有时被称为系统进程,它们执行的代码往往有别于普通的工作进程(即通
常不捕捉信号的进程),身为防范退出信号进一步传播的壁垒,系统进程阻断了与之链接的其他进程和外界直接的联系,因而可用于汇报故障乃至重启故障的子系
统,我们将这类进程称为监督者。
3、分布式
借助于语言属性和基于复制的进程通信,Erlang程序天然就可以分布到多台计算机上,可以直接分布到多个网络节点上。
4、erlang运行时系统和虚拟机

准erlang实现的核心是一个称为erlang运行时系统(ERTS)的应用,这是一大块用C语言写成的代码,负责erlang中所有底层的玩意儿,通
过它你才能跟文件系统和终端打交道,它还处理内存,实现erlang进程的也是它,ERTS知道如何将这些进程分布到现有的CPU资源上才能充分发挥计算
机硬件的能力,同时,哪怕你只有一个单核CPU它也能实现erlang进程的并发执行,ERTS还负责处理进程间的消息传递,并使处在不同机器上运行在各
自的ERTS中的进程能够像处在同一台机器上一样进程通信,erlang中所有需要底层支持的东西都由ERTS处理,所以ERTS移植到哪个平台
erlang就能在哪个平台上跑。
5、函数式编程
函数式编程,其主要思想就是将函数看作和整数、字符串一样的数据。

时间: 2024-08-08 03:02:36

Erlang(一)的相关文章

为什么我要选择erlang+go进行服务器架构

服务器非业余研究http://blog.csdn.net/erlib 作者Sunface 估计很多同学看到这里都会觉得迷惑,go的大名已经如雷贯耳了,但是erlang?这个东东是神马?难道是编程语言?怎么从来没听说过. 这里请允许我先介绍一下使用Erlang开发的比较有名的应用: 一:whatsapp 只凭32个技术人员,如何应付4.5亿的用户?对于刚刚被Facebook用190亿美元收购的WhatsApp来说,答案是Erlang--一种诞生于上世纪80年代的编程语言,终于在此时走到了聚光灯下.

Erlang生成式实现的列表去重、求交集及并集

%集合去重,Acc初始传入为[],存放的是最终的结果 delSame([],Acc) -> Acc; delSame([Pre|T],Acc) ->checkSame([X||X<-T,X=/=Pre],Acc++[Pre]). %求交集 crossList(L1,L2) -> [X||X<-L1,Y<-L2,X=:=Y]. %求并集 mergeList(L1,L2)-> delSame(lists:merge(L1,L2),[]). 总结:(1)erlang的生

erlang 初体验

最近测试了一下 erlang的坑... 如不出意外.... 大家第一眼看到这语法... 心里第一句一定是"我擦.这TM都是啥!!!!!" 没有变量!!! 没有结构体!!! 没有循环!!! 好吧,至少我是这样想的. 找了半天..连个if也不知道怎么写.. 这记录一些基本常识.. -module(module_name)  %%定义模块 括号内的要和文件名相同. -export([fun1/1 fun2/2]) %%这里是导出2个函数对外使用  函数名/参数名. 一个简单的函数定义如下 f

Erlang Application

1.OTP应用组织模式 创建OTP应用时的主要工作集中于保准目录结构的建立和应用元数据的编写.元数据的作用在于让系统获悉应该如何启动和停止应用,还可用于指定应用的依赖项,也就是在应用启动前必须安装或启动哪些其它应用. 2.OTP应用布局 <application-name>[-<version>] | | - doc | - ebin | - include | - priv | - src otp应用布局目录.目录名可以包含版本号.标准子目录包括doc.ebin.include.

linux 基础学习编译安装php+mysql+python3+memcached+radis+rabbitmq+libevent+tcl+gcc+erlang

CentOS 6.9 编译安装 Nginx+PHP+MYSQL 0x01 环境约束 源码位置 /home/[用户文件夹] 源码编译安装位置  /usr/local/[软件名] CentOS6.9 x86 - 64 最小化安装 配置好网络 用户 使用Xshell登录 0x02 软件下载 内网地址: http://192.168.20.252/src/php.tar.gz http://192.168.20.252/src/cmake.tar.gz http://192.168.20.252/src

Erlang自研引擎与Redis-Mensia比较

数据库性能测试 windows 测试环境: 系统:win7 ,内存:16G , CPU:Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz 3.40GHz ,p25单节点写(每条数据大小50Byte):速率(不间断写入):25000条/秒写入上限:1200w条 无锁读(单条数据50Byte):速率(不间断读取):35000条/秒上限:无 锁读(单条数据50Byte):速率(不间断读取):30000条/秒上限:无 写(单条数据200k):速率(不间断写入): 5000条

Erlang网络编程中的一个特别的函数prim_inet:async_accept/2(转)

为了研究怎么用Erlang写一个游戏服务器,我很幸运的下到了一份英雄远征的服务器Erlang源码,这两天花了点时间看代码,其中看到做TCP的accept动作时,它是用的一个函数prim_inet:async_accept/2,这个可跟书上说的不一样(一般来说书上教的是用gen_tcp:accept/1),于是我google了一下,发现找不到文档,再翻一下发现已经有不少人问为什么这是一个undocumented的函数,也就是说Erlang就没想让你去用这个函数,所以文档自然没提供.一般来说undo

使用erlang 建立一个自动化的灌溉系统(1)准备工作

1. 你需要一台电脑作为监控系统的控制中心.(我直接用了垃圾机器装了debian 系统) 2. 安装一个你喜欢的编辑器 .(我个人比较喜欢wingide ,主要我需要写点python 代码) 3.一台树莓派.(这个资料很多,我们客户端的python 代码都在上面实现) 4.到github 上下载最新的erlang 代码和yaws  直接编译源码.(yaws 安装 会有些问题,你可以参考http://www.cnblogs.com/codewarelock/articles/4781656.htm

使用git下载编译erlang

git clone https://github.com/erlang/otp cd otp git tag git checkout -b OTP-18.2.2 OTP-18.2.2 ./otp_build all export LANG=en ./configure --prefix=/usr/local/otp-18.2.2 make make install make install-docs

Erlang 热更新机制

Current and Old Code The code of a module can exists in two variants in a system: current code and old code. When a module is loaded into the system for the first time, the code of the module becomes 'current' and the global export table is updated w