`
做一行爱一行吧
  • 浏览: 23518 次
  • 性别: 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下我们去创建两个进程来测试一下注册问题会是什么结果,下次就写一个完整的代码结构了测试一下!

 

 

分享到:
评论

相关推荐

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...

    erlang并发编程 .pdf

    在《Erlang并发编程》一书中,详细介绍了Erlang语言的核心并发模型和编程范式,包括但不限于串行编程、进程创建、进程间通信、分布式编程以及错误处理等。书中指出Erlang的并发性能得益于其轻量级进程,这些进程是由...

    erlang并发编程实战源代码

    erlang并发编程实战源代码erlang并发编程实战源代码

    erlang并发编程中文翻译(cpie-cn).zip

    《Erlang并发编程》是一本深入探讨Erlang编程语言并发特性的书籍,中文翻译版为《erlang并发编程中文翻译(cpie-cn...书中涵盖了Erlang并发编程的基础概念、高级技巧以及实际案例,是深入理解Erlang并发特性的宝贵资源。

    erlang并发编程

    Erlang并发编程是Erlang语言的核心特性之一,它为构建高效、容错的分布式系统提供了强大的工具。Erlang是一种函数式编程语言,特别适合处理并发和实时系统,因其在电信行业的广泛应用而闻名。以下是一些关于Erlang...

    Erlang并发编程 part1

    erlang并发编程,erlang之父Joe Armstrong得原著之一。

    ERLANGOTP并发编程实战清晰中文版

    erlang otp学习文档 学习还不错的

    Erlang OTP并发编程实战(中文版)

    **Erlang OTP并发编程实战** 是一本专为开发者深入理解Erlang OTP并发机制而设计的实战指南。OTP(Open Telecom Platform)是Erlang编程语言的核心组件,提供了强大的并发处理能力和分布式系统构建框架。这本书以...

    ErlangOTP并发编程实战

    《erlang/otp并发编程实战》侧重生产环境下的erlang 开发,主要讲解如何构建稳定、版本控制良好、可维护的产品级代码,凝聚了三位erlang 大师多年的实战经验。 《erlang/otp并发编程实战》主要分为三大部分:第一...

    Erlang脚本在并发编程中的应用及其代码实现

    Erlang是一种专为并发和分布式系统设计的编程语言,它以轻量级进程、消息传递和强大的模式匹配机制而闻名。Erlang脚本在并发编程中的应用广泛,从简单的多进程通信到复杂的分布式系统构建,Erlang都能提供高效的解决...

    Erlang OTP并发编程实战 附书源码

    Erlang OTP并发编程实战是深入理解Erlang并发特性和 OTP(Open Telephony Platform)设计原则的关键资源。这本书的附书源码包含了14个章节的实例代码,旨在帮助读者通过实践掌握Erlang在分布式系统、容错以及高并发...

    erlang资源

    这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入理解和学习Erlang语言的关键资料。 《Erlang并发编程》这本书可能涵盖了以下知识点: 1. **并发模型**:Erlang的并发...

    ErlangOTP并发编程实战(高清PDF版)

    书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发系统...

    [Erlang] Erlang OTP 并发编程实战 (英文版)

    [Manning Publications] Erlang OTP 并发编程实战 (英文版) [Manning Publications] Erlang and OTP in Action (E-Book) ☆ 出版信息:☆ [作者信息] Martin Logan, Eric Merritt, Richard Carlsson [出版机构] ...

    并发需求下的Scala及Erlang语言的比较与使用

    ### 并发需求下的Scala及Erlang语言的比较与使用 在当今的高并发、大数据处理场景下,选择合适的编程语言对于系统性能至关重要。在众多编程语言中,Scala和Erlang因其强大的并发处理能力和函数式编程特性而受到关注...

    Erlang程序设计(第二版)及源码

    书中兼顾了顺序编程、并发编程和分布式编程,重点介绍如何编写并发和分布式的Erlang程序以及如何在多核CPU上自动加速程序,并深入地讨论了开发Erlang应用中至关重要的文件和网络编程、OTP、ETS和DETS等主题。...

    erlang编程 Introducing Erlang

    Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,旨在帮助初学者理解和掌握Erlang的核心...

Global site tag (gtag.js) - Google Analytics