1.erlang中创建进程(非操作系统线程,比其要轻量很多)非常方便,运用spawn函数即可
spawn(Fun) -> pid()
spawn(Node, Fun) -> pid()
spawn(Module, Function, Args) -> pid()

使用eg:spawn(io,format,["123"]).
123
-------------------------------------------------------------------------------------------
2.erlang原生方法中的erlang模块有很多可以查看进程的方法:
erlang:system_info(process_count),
erlang:memory(processes)
查看进程的相关信息
erlang:process_info(Pid) -> InfoResult
Types:
Pid = pid()
Item = atom()
Info = term()
InfoTuple = {Item, Info}
InfoTupleList = [InfoTuple]
InfoResult = InfoTupleList | undefined

使用eg:
{memory,Mem}=erlang:process_info(H,memory),
{current_function,{Module, Function, Args}}=erlang:process_info(H,current_function),
erlang:process_info(Owner, registered_name)
-------------------------------------------------------------------------------------------
3.进程之间通过消息进行信息交换,消息发送的字符是!
run() ->
Pid =spawn(fun girOnly/0),
Pid ! self(), %%1.给自己发信息,发送自己的进程pid
receive
sir -> no;
madam -> ok %%3.收到madam,就返回ok
end.

girOnly() ->
receive
From -> From ! madam %%2.接收到的是地址pid,就发送给自己madam
end.
-------------------------------------------------------------------------------------------
4.进程终止&监督&退出信息捕捉
进程是相互独立的,进程崩溃会产生一个退出信息,与之链接的进程都会相应的接收到崩溃消息并一起退出。但是我们希望进程退出的时候做相应的处理:
OTP实现容错的主要途径之一就是改写退出信号默认的传播行为。通过设置trp_exit进程标记,可以使进程不再服从外来的退出信号,而是将之捕捉。
这种情况下,进程接收到信息后会先将其转为{'Exit',Pid,Reason}的消息,然后这条消息会像普通消息一样被丢入信箱,捕捉到信号的进程就能分类进行处理了。
这类进程有时被称为系统进程。该类进程阻断了与之链接的其他进程和外界之间的联系,因而可以汇报故障&重启故障的子系统,我们称之为“监督者”。
-module(xml_server).

-behaviour(gen_server).

-export([start_link/0,client_port/0]).

-export([init/1,handle_call/3,handle_cast/2,handle_info/2,code_change/3,terminate/2]).

start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

init([]) ->
process_flag(trap_exit, true),
。。。
{ok, []}.

elang的进程链接与监督者共同提供了一种“重启”机制。OTP允许监督者按预设的方式和次序来启动进程。我们还可以告知监督者如何在单个进程故障时重启其他
进程、一段时间内尝试重启几次后放弃重启等。
-------------------------------------------------------------------------------------------
5.OTP提供的监督者行为
(四种重启策略:)
one_for_one,simple_one_for_one :没有依赖(只启动这个)不过它们的集体失败会导致整个application的shutdown
rest_for_one:线性依赖的进程,1->2->3->4->5, 2死了,会启动2,3,4,5,不会启动1;
one_for_all:完全相互依赖的进程。
Module:init(Args) -> Result
Types:
Args = term()
Result = {ok,{{RestartStrategy,MaxR,MaxT},[ChildSpec]}} | ignore
?RestartStrategy = one_for_all | one_for_one | rest_for_one | simple_one_for_one
?MaxR = MaxT = int()>=0
?ChildSpec = child_spec()
child_spec() = {Id,StartFunc,Restart,Shutdown,Type,Modules}
Id = term()
StartFunc = {M,F,A}
M = F = atom()
A = [term()]
Restart = permanent | transient | temporary
Shutdown = brutal_kill | int()>=0 | infinity
Type = worker | supervisor
Modules = [Module] | dynamic
Module = atom()

使用eg:
-module(chat_supervisor).
-behaviour(supervisor).
-export([start/0,init/1]).
start() ->
{ok,Pid} = supervisor:start_link({local,?MODULE},?MODULE,[]),
unlink(Pid),
{ok,Pid}.

init([]) ->
{ok,{
{one_for_one,3,3600},
[
%数据库管理进程
{spec_chat_data1,{chat_data,start,[]},permanent, brutal_kill, worker,[chat_data]},
%服务端监控进程
{spec_chat_server1,{server,start_link,[]},permanent,brutal_kill,worker,[server]}
]}}.

erlang并发编程的更多相关文章

  1. Erlang 102 Erlang并发编程

    笔记系列 Erlang环境和顺序编程Erlang并发编程Erlang分布式编程YawsErlang/OTP 日期              变更说明 2014-11-02 A outline 2014 ...

  2. erlang并发编程(二)

    补充-------erlang并发编程 Pid =spawn(fun()-> do_sth() end). 进程监视: Ref = monitor(process, Pid)靠抛异常来终结进程 ...

  3. Erlang 103 Erlang分布式编程

    Outline 笔记系列 Erlang环境和顺序编程Erlang并发编程Erlang分布式编程YawsErlang/OTP 日期              变更说明 2014-11-23 A Outl ...

  4. Erlang基础 -- 介绍 -- 历史及Erlang并发

    前言 最近在总结一些Erlang编程语言的基础知识,拟系统的介绍Erlang编程语言,从基础到进阶,然后再做Erlang编程语言有意思的库的分析. 其实,还是希望越来越多的人关注Erlang,使用Er ...

  5. Erlang入门(二)—并发编程

    Erlang中的process——进程是轻量级的,并且进程间无共享.查了很多资料,似乎没人说清楚轻量级进程算是什么概念,继续查找中...闲话不提,进入并发编程的世界.本文算是学习笔记,也可以说是< ...

  6. 《C++ 并发编程》- 第1章 你好,C++的并发世界

    <C++ 并发编程>- 第1章 你好,C++的并发世界 转载自并发编程网 – ifeve.com 本文是<C++ 并发编程>的第一章,感谢人民邮电出版社授权并发编程网发表此文, ...

  7. Python 的并发编程

    这篇文章将讲解 Python 并发编程的基本操作.并发和并行是对孪生兄弟,概念经常混淆.并发是指能够多任务处理,并行则是是能够同时多任务处理.Erlang 之父 Joe Armstrong 有一张非常 ...

  8. Erlang OTP编程初体验——gen_server和行为模式

    http://blog.sina.com.cn/s/blog_3fe961ae0101k4p6.html 行为模式其实非常类似于面向对象语言中的接口,至少笔者是这么理解的.OTP行为模式将一些反复出现 ...

  9. 并发-Java并发编程基础

    Java并发编程基础 并发 在计算机科学中,并发是指将一个程序,算法划分为若干个逻辑组成部分,这些部分可以以任何顺序进行执行,但与最终顺序执行的结果一致.并发可以在多核操作系统上显著的提高程序运行速度 ...

随机推荐

  1. springboot实现自定义的错误页面展示

    https://blog.csdn.net/trusause/article/details/84299886 参考 SpringBoot默认的错误处理机制 默认效果为: 返回一个默认的错误页面 Wh ...

  2. 【python 3】 函数 进阶

    函数进阶 1.函数命名空间和作用域 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input , print , str ...

  3. OO随笔

    第一次作业——多项式计算 1.自我程序分析 第一次作业是多项式计算,只使用了一个多项式类.第一次接触面向对象的程序,还比较生疏,不是很能理解面向对象的思想.将读入,处理,计算,都放到了main函数中, ...

  4. mysql 基本sql使用总结-电商项目

    一.增加 1. 设置插入数据后自动返回主键 主键返回策略只适用于单个对象的插入: 主键返回策略: (1) 单独参数 直接用set方法 (2)  map 对象名.id (3) 多参数列表 对象名.id( ...

  5. 1047 Integer Inquiry

    String 大数加法模板 #include<stdio.h> #include<string> #include<iostream> using namespac ...

  6. Django 应用程序 + 模型 + 基本数据访问

    如果你只是建造一个简单的web站点,那么可能你只需要一个app就可以了.如果是复杂的象 电子商务之类的Web站点,你可能需要把这些功能划分成不同的app,以便以后重用. 确实,你还可以不用创建app, ...

  7. HBase RegionServer Splitting 流程

    RegionServer Splitting 实现 HBase 中的写请求由 Region Server 处理,这些数据首先存储在 memstore (RegionServer 里的一个存储系统)里. ...

  8. ionic 在windows环境下更换logo和加载图片的问题

    做用自己的电脑做ionic项目时,更换logo和加载图片时,无论使用哪种命令,发现都上传不了,并且报错 最后发现,需要将 icon和splash两个文件改为.ai格式才能上传成功. 这是最终生成后的文 ...

  9. Vue 组件异步加载(懒加载)

    一.vue的编译模式 (1)路由配置信息 //eg1: const MSite = resolve => require.ensure([], () =>resolve(require([ ...

  10. js统一设置富文本中的图片宽度

    var txt = layedit.getContent(ieditor);//获取编辑器内的文本var regex = new RegExp('<img', 'gi');txt = txt.r ...