1.认识并发与并行
并行是指两个或者多个事件在同一时刻发生。
并发是指两个或多个事件在同一时间间隔交替发生。
2.认识Erlang程序的并发
Erlang程序会包含几十、几千、甚至几十万个小进程,每个进程都拥有一块私有内存区域。Erlang进程不共享内存,所以不用像java那样上锁。
3.基本并发函数
PID=spawn(Fun):Pid是用来给进 程发送消息,创建一个新的并发进程来执行Fun()。
Pid !Message:向标识符为Pid的进程发送消息Message。消息发送是异步的。
receive
模式1->
做什么事 ;
模式2->
做什么事
end.
接收信息,做出反应
4.客户端-服务器介绍
传统的客户端与服务器是多对一的形式,而Erlang只是两个进程,客户端总是通过向服务器发送一个 请求来发起计算。服务器计算后生成回复,然后发送一个响应给客户端。
rac(Pid, Requst)->
PID ! {self(), requst} %%发送消息,并将自己的pid发送
receive
{pid, response}->
response
end.
loop()->
receive
{From, {r,w,h}}->
From! {self(), w*h}, %%返回消息给客户端
loop();
{From, other}->
From! {self(), other},
response
end.
5.进程是很小的
分裂20 000个进程平均消耗了3.0微秒/进程的CPU时间和3.4微秒/进程的实际运行时间。我们也需要考虑到内存,随着进程数量的增加,进程分裂 时间也在增加。如果继续增加进程的数量,最终会耗尽物理内存,导致系统开始把物理内存交换 到硬盘上,运行速度明显变慢。
6.超时的接收
receive
模式1->
做什么事 ;
模式2->
做什么事;
after time->
A
end.
如果在进入接收表达式的Time毫秒后还没有收到匹配的消息,进程就会停止等待消息,执行A。
只带超时
receive
after time->
A
end.
超时值为 0 的接收
receive
模式1->
做什么事 ;
模式2->
做什么事;
after 0->
A
end.
7.注册进程
register(原子,pid):注册进程,用AnAtom(一个原子)作为名称来注册进程Pid。如果AnAtom已被用于注册某个进程, 这次注册就会失败
unregister(原子,pid):移除与AnAtom关联的所有注册信息
whereis(原子)->pid| :判断是否注册
8尾递归
含义:先执行,后调用
好处:无需消耗栈空间也能一 直循环下去。