`
做一行爱一行吧
  • 浏览: 22645 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

erlang的并发(二)

 
阅读更多

生产中erlang的并发处理大多都是依靠四大行为来完成,这个以后再说!

我们有的时候可能会误解一个问题就是一个接收消息是如何处理的,直观的去看,是A发一条消息给B,B处理以后返回一个消息,一开始我也这么想,但是这就又带来了另一个问题,那现在如果又有其他人也给B发消息怎么办,那我们就需要一个地方去存储些同时发来的消息,以供A来处理。

 

回想一下上回我们说的邮局问题

 

我们来扩展一下,人们将信件发送给邮局,邮局又将无数的信件发送给了每个人,但是收到信件的人无法处理如此多的信件,怎么办呢,那就用一个邮箱来代替,收信人打开邮箱去挑选(想想你拿着一沓信件是怎么看的呢,看过以后的信件放在最后然后看下一个,一次循环),没错,这是队列式的方式(关于进程邮箱很多资料都有详细介绍就不说了

 

我们在处理进程的问题时经常会出现并没有得到自己想要的消息,这怎么办?一直占用内存等待下去?

当然不会,简单的 receive处理为我们提供了一个小方法,就是after

把上次的程序扩展一下

 

rpc(Pid, Request) ->
	Pid ! {self(), Request},
	receive
		{Pid, Response} ->    %%用于确认是否是该进程发送的消息
			Response
	after 
		2000 ->
			past
	end.

loop() ->
	receive
		{From, {move, Distance}} ->
			From ! Distance,
			loop();
		{From, {jump, Distance}} ->
			From ! Distance,
			loop();
		{From, {stop, Time}} ->
			From ! Time,
			loop();
		{From, Other} ->
			From ! {error, Other},
			loop()
	after 
		2000 ->
			past
	end.

 数字2000是毫秒单位,你可以自己换算一下,根据自己的需要来调整。

 

 注册进程中我遇到了很多的问题,这样的时候一般会看节点信息和打印结果来分析

言归正传

我们来注册一个进程,(这里我还是稍有疑问,看一下测试)

 

-module(server3).
-export([
	test1/0,
	test2/0,
	test3/0
]).

test1() ->
	Pid1 = spawn(fun server1:loop/0),
	register(aaa, Pid1).

test2() ->
	Pid2 = spawn(fun server2:loop/0),
	register(bbb, Pid2).

test3() ->
	aaa ! 1000.

 

 我调用了test1()和test3(),结果出乎意料,是bad argument。就是说我注册的进程名不对

E:\test>erl
Eshell V5.9  (abort with ^G)
1> server3:test1().
true
2> server3:test3().
** exception error: bad argument
     in function  server3:test3/0 (server3.erl, line 17)
 为什么?我又修改了一下代码

 

 

-module(server3).
-export([
	test1/0,
	test2/0
]).

test1() ->
	Pid1 = spawn(fun server1:loop/0),
	register(aaa, Pid1),
	aaa!1000.

test2() ->
	Pid2 = spawn(fun server2:loop/0),
	register(bbb, Pid2).
 测试一下
E:\test>erl
Eshell V5.9  (abort with ^G)
1> server3:test1().
1000
这里正确了。

但是我查看注册名的时候并没有我注册的aaa?
2> registered().
[code_server,global_name_server,file_server_2,
 application_controller,init,standard_error_sup,
 standard_error,global_group,erl_prim_loader,user,
 error_logger,rex,inet_db,kernel_sup,kernel_safe_sup]

这里查看aaa的进程id的时候也没有?
3> whereis(aaa).
undefined

但是我在注册进程中输入了这样一个消息
ฐErlang R15B (erts-5.9) [smp:4:4] [async-threads:0]

Eshell V5.9  (abort with ^G)
1> register(aaa, Pid).
* 1: variable 'Pid' is unbound
2> register(aaa, self()).
true
3> registered().         
[code_server,global_name_server,file_server_2,
 application_controller,init,user_drv,standard_error_sup,
 standard_error,global_group,erl_prim_loader,aaa,user,
 error_logger,rex,inet_db,kernel_sup,kernel_safe_sup]
4> 
4> whereis(aaa).
<0.31.0>
5> 
这次我们查到了我们注册的进程也查到了,它确实存在

 这时我不禁就开始猜想erlang的注册进程的实现范围,如果是在本进程对自己注册一个别名,那他注册到了哪里?self()注册时注册到了kernel这个app上,但是自己生成的一个新进程既我没有挂在同一个app上的时候的确报错了,为什么?一个节点下可以设置许多app来管理自己的代码,那么我们把范围缩小到app,那相同app下我们去创建两个进程来测试一下注册问题会是什么结果,下次就写一个完整的代码结构了测试一下!

 

 

分享到:
评论

相关推荐

    毕设项目:C++ Qt 基于数据库Mysql学生信息管理系统.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    洛雪音乐助手自定义音源v1.2.0下载.zip

    洛雪音乐助手自定义音源v1.2.0下载.zip

    125.0.6422.142 -chromedriver-win64

    版本为125.0.6422.142的chromedriver,供对应版本的谷歌浏览器进行爬虫的驱动

    160-微信小程序-信息科技公司展示小程序.zip

    源代码+截图

    aiohttp-3.7.0-cp37-cp37m-manylinux1_i686.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    带外设的51单片机,集成了0.96英寸的屏幕和外接的引脚.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    cryptography-2.4.1-cp35-cp35m-win_amd64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    上市公司企业短期并购绩效和长期并购绩效数据集合(2008-2022).txt

    因文件较多,数据存放网盘,txt文件内包含下载链接及提取码,永久有效。 样例数据及详细介绍参见文章:https://blog.csdn.net/li514006030/article/details/139608790

    《低成本开放式架构跌倒检测系统作为无线传感器网络实现》matlab代码.rar

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    牛顿环仿真matlab.rar

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于555定时器的占空比可调电路单稳态延时电路积分电路multisim仿真电路.zip

    基于555定时器的占空比可调电路单稳态延时电路积分电路multisim仿真电路: 单稳态延时电路.ms10 单稳态延时电路.ms10 (Security copy) 占空比可调电路设计.ms10 占空比可调电路设计.ms10 (Security copy) 积分电路.ms10 积分电路.ms10 (Security copy)

    087-微信小程序-课程预约.zip

    源代码+截图

    EnviroSkyandWeather v2.1.1(u2017.1.2)真实动态天气系统包

    unity真实动态天气系统包

    openHarmony的编码规范

    openHarmony的编码规范

    小程序-32-基于微信小程序的新生报到系统--LW-源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    cryptography-1.4-cp33-cp33m-win_amd64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    计算机专业毕设课设-JAVA班主任管理系统(源代码+论文).zip

    计算机专业毕设课设-JAVA班主任管理系统(源代码+论文).zip

    私人云盘(自动云同步)

    1、实现功能:模仿小米的云服务,实现一个通过TCP实现的私人云盘,因为能力有限,所以只实现自动云同步这一个功能,具体可以分为三个小功能,即保持云端和终端数据一致、实现文件的上传与下载以及手动同步。 2、涉及知识点:涉及到的知识点主要有文件的打开与关闭,文件的发送与接收,文件的写入及socket通信,为了项目整体的间接性,还使用到的枚举类型的结构体以及链表对部分功能进行了封装。 3、通过项目进一步强化自己学习到的知识,并将其融会贯通,提升自己的编程能力

    atcoder ABC 354-ABC题详解

    难度划分: A题:ABC比赛中最简单的一道题目,通常是基础的输入输出题或简单的数学运算。解决A题所需思维和编程能力相对较低,通常可在10分钟内完成。 B题:中等难度的题目,可能涉及一些较为复杂的算法,需要一定的逻辑思维和编程技巧。解决B题可能需要20分钟到半个小时的时间。 C题及以上:难度逐渐增加,可能需要更深入的专业知识和算法能力。

    基于springboot的驾校管理系统

    开发语言:Java JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.6/5.7(或8.0) 数据库工具:Navicat 开发软件:idea 依赖管理包:Maven 代码+数据库保证完整可用,可提供远程调试并指导运行服务(额外付费)~ 如果对系统的中的某些部分感到不合适可提供修改服务,比如题目、界面、功能等等... 声明: 1.项目已经调试过,完美运行 2.需要远程帮忙部署项目,需要额外付费 3.本项目有演示视频,如果需要观看,请联系我v:19306446185 4.调试过程中可帮忙安装IDEA,eclipse,MySQL,JDK,Tomcat等软件 重点: 需要其他Java源码联系我,更多源码任你选,你想要的源码我都有!

Global site tag (gtag.js) - Google Analytics