博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Erlang并发与并发编程(二)
阅读量:4927 次
发布时间:2019-06-11

本文共 1569 字,大约阅读时间需要 5 分钟。

 

上节我主要讲了Erlang并发编程的模型和相关概念,详见:,本节将主要讲述我对于Erlang并发编程的理解,本文主要思想来源于书籍:《Erlang程序设计》。

我们知道操作系统有自己的一套原语,Erlang也有自己的原语系统。首先,我们要明白的就是Erlang中的进程与OS中的进程是不一样的,它们是不等同的,在Erlang编程的时候,可以创建、链接Erlang自己的进程,它们运行在Erlang虚拟机(VM)上,如下示意图清晰地道明了OS进程与Erlang进程的区别:

Erlang三个并发原语:

  1. spawn原语:
    Pid = spawn(Fun) %% 创建一个新的进程,用于对Fun求值,返回值为Pi,
    在分布式系统编程中时,spawn还有一个参数,可以指定在某个节点(Node)上创建一个进程,其中的Fun,是一个函数引用,意思是创建一个进程用于对Fun函数进行求值或运算;
  2. send原语:
    Pid ! message  %% 向进程发送消息,返回值为消息本身
    注:Erlang中的发送消息原语不是send,而是感叹号“!”;当然可以向多个进程发送同一条消息,如:
    Pid 1!Pid2!… !Message  %%将消息发送到多个进程
  3. receive原语:格式为:Receive … and %%接受一个发给当前进程的消息,语法如下:

    Receive   Pattern1 [when Guard1] ->   Expression1;   Pattern2 [when Guard2] ->   Expression2;   …    %% 后面还会讲到,receive原语,还涉及到超时的问题 end.

     

小例:功能:求圆或矩形的面积。

-module(area_server0). -export([loop/0]). loop() -> receive     {rectangle,Width,Ht} ->         io:format("Area of rectangle is ~p~n",[Width * Ht]),         loop();     {circle,R} ->         io:format("Area of circle is ~p~n",[3.14159 * R *R]),         loop();     Other ->         io:format("I don't know what the area of a ~p~n",[Other]),         loop() end.

 在Erlang命令窗口中运行一下:

 

客户/服务器:

客户/服务器架构是Erlang的核心内容,在Erlang中,客户/服务器架构下的客户机和服务器都是分离的进程,它们之间的通信都需要Erlang的消息传递机制。客户机和服务器可以运行在同一台机器上,也可以运行在不同的机器上。

小例:第一个客户服务器,功能:求圆或矩形的面积。(源码不再机器上,截图给大家,请初学者自己敲敲代码熟悉)

 在Erlang命令窗口中运行一下:

一点瑕疵:

在area_server1:rpc/2中,我们向服务器发送一个请求,然后等待回应。 如果在这个客户机等待来自服务器的回应时,其他的进程也向这个客户机发送了消息,那么它会把这个消息误认为是来自服务器的回应。

 例如,发送信息时,客户机将自己的地址发给了服务器;接受信息时,服务器并没有将他的地址告知客户机。

因此,下节我会继续并发编程问题进行阐述,将上述这个问题解决,同时引进接受信息超时的问题。

 

转载于:https://www.cnblogs.com/itfreer/archive/2012/03/23/chinagragon.html

你可能感兴趣的文章
定期备份脚本
查看>>
生成桌面插件
查看>>
Unable to resolve target 'android-9'
查看>>
vector和list的区别
查看>>
[LeetCode] 127. Word Ladder _Medium tag: BFS
查看>>
20172302 《程序设计与数据结构》第四周学习总结
查看>>
FZU 2086 餐厅点餐(枚举)
查看>>
HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者(基础巴什博奕)
查看>>
多态,虚函数
查看>>
Could not obtain information about Windows NT group/user 'xxxx\xxxx', error code 0x5
查看>>
get_locked_objects_rpt.sql
查看>>
基于SignalR的消息推送与二维码描登录实现
查看>>
jquery 绑定事件
查看>>
排序之快速排序
查看>>
单调队列&单调栈归纳
查看>>
新安装的jdk,不知道为啥一直走别的jdk路径
查看>>
leetcode 9. Palindrome Number
查看>>
2018/1/9 redis学习笔记(一)
查看>>
协程 - 单线程并发--day36
查看>>
oracle存储过程遇到的问题
查看>>