`
jjchen_lian
  • 浏览: 86213 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

erlang进程总结

 
阅读更多

 

代码一:
-module(exit_demo).  
-export([start_a/0,start_b/1,af1/1]).  
  
start_a()->  
    spawn(fun af/0).  
      
af()->  
    io:format("process a created."), 
	%%process_flag(trap_exit,true),
    receive  
		
		{'EXIT',_Pid,abc} ->  
           io:format("kill"),
		   af();
		   
		%%{'EXIT',_Pid,normal} ->  
        %%  io:format("normal"); 
		   
		{'EXIT',_Pid,kill} ->  
           io:format("kill"),
		   af()
		   
     
       
     
    end.  
  
start_b(Pid)->  
    spawn(exit_demo,af1,[Pid]).  
  
af1(Pid)->  
    link(Pid),
	exit(normal),
	receive
		X -> X
	end.

 代码二:

 

-module(exit_demo).  
-export([start_a/0,start_b/1,af1/1]).  
  
start_a()->  
    spawn(fun af/0).  
      
af()->  
    io:format("process a created."), 
	%%process_flag(trap_exit,true),
    receive  
		
		{'EXIT',_Pid,abc} ->  
           io:format("kill"),
		   af();
		   
		%%{'EXIT',_Pid,normal} ->  
        %%  io:format("normal"); 
		   
		{'EXIT',_Pid,kill} ->  
           io:format("kill"),
		   af()
		   
     
       
     
    end.  
  
start_b(Pid)->  
    spawn(exit_demo,af1,[Pid]).  
  
af1(Pid)->  
    link(Pid),
	exit(Pid,normal),
	receive
		X -> X
	end.

 代码三:

 

-module(exit_demo).  
-export([start_a/0,start_b/1,af1/1]).  
  
start_a()->  
    spawn(fun af/0).  
      
af()->  
    io:format("process a created."), 
    process_flag(trap_exit,true),
    receive  
		
		{'EXIT',_Pid,abc} ->  
           io:format("kill"),
		   af();
		   
		%%{'EXIT',_Pid,normal} ->  
        %%  io:format("normal"); 
		   
		{'EXIT',_Pid,kill} ->  
           io:format("kill"),
		   af()
		   
     
       
     
    end.  
  
start_b(Pid)->  
    spawn(exit_demo,af1,[Pid]).  
  
af1(Pid)->     link(Pid),exit(Pid,normal),receive X -> X end.

 代码四:

 

-export([start_a/0,start_b/1,af1/1]).  
  
start_a()->  
    spawn(fun af/0).  
      
af()->  
    io:format("process a created."), 
	process_flag(trap_exit,true),
    receive  
		
		{'EXIT',_Pid,abc} ->  
           io:format("kill"),
		   af();
		   
	         {'EXIT',_Pid,normal} ->  
           io:format("normal"); 
		   
		{'EXIT',_Pid,kill} ->  
           io:format("kill"),
		   af()
		   
     
       
     
    end.  
  
start_b(Pid)->  
    spawn(exit_demo,af1,[Pid]).  
  
af1(Pid)->  
    link(Pid),
	exit(Pid,normal),
	receive
		X -> X
	end.
 
 

代码五:

 

-export([start_a/0,start_b/1,af1/1]).  
  
start_a()->  
    spawn(fun af/0).  
      
af()->  
    io:format("process a created."), 
	process_flag(trap_exit,true),
    receive  
		
		{'EXIT',_Pid,abc} ->  
           io:format("kill"),
		   af();
		   
	         {'EXIT',_Pid,normal} ->  
           io:format("normal"); 
		   
		{'EXIT',_Pid,kill} ->  
           io:format("kill"),
		   af()
		   
     
       
     
    end.  
  
start_b(Pid)->  
    spawn(exit_demo,af1,[Pid]).  
  
af1(Pid)->  
    link(Pid),
	exit(Pid,kill),
	receive
		X -> X
	end.
 

 代码六

 

-export([start_a/0,start_b/1,af1/1]).  
  
start_a()->  
    spawn(fun af/0).  
      
af()->  
    io:format("process a created."), 
	process_flag(trap_exit,true),
    receive  
		
		{'EXIT',_Pid,abc} ->  
           io:format("kill"),
		   af();
		   
	         {'EXIT',_Pid,normal} ->  
           io:format("normal");,
		   
		%%{'EXIT',_Pid,kill} ->  
           %%io:format("kill"),
		%%   af()
		   
     
       
     
    end.  
  
start_b(Pid)->  
    spawn(exit_demo,af1,[Pid]).  
  
af1(Pid)->  
    link(Pid),
	exit(Pid,kill),
	receive
		X -> X
	end.
 分布执行 
      Pid = exit_demo:start_a().
      Pid1 = exit_demo:start_a(Pid).
      erlang:is_process_alive(Pid).
      erlang:is_process_alive(Pid1).
分别查看输出的结果,并且思考原因。
下面总结几个小点:1,当一个进程死掉之后,一条退出信号会广播给所有和这个进程有link的进程
2,这个信号的会包括退出原因,但是这个原因有可能是任何erlang的数据结构
3,进程可以使用exit(Reason)来使自己退出
4,eixt(Pid,Reason),如果Pid进程是普通进程,那么普通进程将会退出,如果
Pid进程是系统进程,那么当Reason不是kill时,系统进程不管是否捕获发来的
消息,系统进程都不会退出,但是如果Reason是kill时,那么不管该进程是什么
类型的进程都将退出。而当前的进程处于假死状态,还会继续存活着。进程完成
了自己的工作而退出的时候,这时候的退出原因是normal,其他进程(必须是系统
进程)收到的消息是{'EXIT',Pid,normal},而普通进程却不能捕获任何信息,并且
不会退出		
system process
1,调用process_flag(trap_exit,true)就可以将一个普通的进程编程系统进程
2,到一条非normal的退出信号送到一个普通进程的时候,普通进程就会挂掉
3,如果是到一个系统进程的话,将会把这个退出信号打包成一条普通的消息
{'EXIT',Pid,Why}存放在邮箱里
4,另外,可以发送一个kill消息给一个进程,无论是不是系统进程,进程都
将挂掉,并且广播一个killed的消息给链接的进程,这个功能要小心使用,一
般是系统来杀掉没事干的进程用的
分享到:
评论

相关推荐

    erlang 中进程

    由于Erlang进程是独立的,当一个进程崩溃时,它不会影响其他进程。OTP的错误处理机制允许系统优雅地处理错误,恢复到稳定状态。Supervisors可以配置为简单的一次重启、有限次数的重启或停止整个子树,从而避免无限...

    Erlang6大数据存储方式总结

    通过《ets数据结构总结1.txt》和《ets数据结构总结2-Mnesia.txt》,你可以深入了解ETS的各类数据结构及其在连接外部数据库(如《ets数据结构总结3-连接外部数据库.txt》中提到的MySQL)时的应用场景和策略。...

    Erlang_CNode用户指

    CNode的主要功能包括创建Erlang进程,发送和接收消息,以及调用Erlang的函数。 **Erlang_CNode用户指南** Erlang_CNode用户指南通常会涵盖以下几个核心主题: 1. **安装和配置**:指导用户如何在系统上安装Erlang...

    Erlang入门

    Erlang的并发模型是基于轻量级进程(也称为Erlang进程)的,它们之间的通信通过消息传递完成。这种方式降低了同步开销,提高了系统的并行性。每个进程都有自己的内存空间,减少了数据竞争的风险。当一个进程崩溃时,...

    erlang-java聊天

    在构建聊天系统时,Erlang的轻量级进程(也称为Erlang进程)可以有效地支持多用户间的实时消息传递。此外,Erlang的分布式特性使得在多台机器上部署和扩展聊天服务变得简单。 **Java的普及与优势** Java是广泛应用...

    erlang深度分析.pdf

    以上总结了Erlang深度分析的主要知识点,涵盖了虚拟机、性能分析、编码实践、分布式系统开发、内存管理、高可用性设计、网络通信、热部署、并发模型、本地接口设计、系统监控以及社区资源等多个方面。这些知识能够...

    erlang websocket

    它们提供了方便的中间件,使得在Erlang进程中直接处理Websocket连接成为可能。例如,`cowboy`中的`cowboy_websocket`模块提供了创建和管理Websocket连接的接口。 二、JSON交互 1. **JSON格式**:JSON(JavaScript ...

    Erlang和RabbitMQ安装包

    总结来说,Erlang和RabbitMQ是构建高并发、分布式系统的重要工具,RabbitMQ利用Erlang的强大特性提供了稳定、高效的消息传递服务。理解并熟练掌握这两者,对于开发大规模、高可用性的应用程序具有重要意义。

    Erlang-otp_win64_23.0.zip

    总结来说,"Erlang-otp_win64_23.0.zip"提供的Erlang OTP 23.0版本是安装RabbitMQ所必需的前置条件,尤其对于Windows 64位用户而言。这个版本包含了运行RabbitMQ所需的所有组件,并且进行了优化,能够提供一个稳定且...

    Erlang编程语言

    总结来说,Erlang是一种专门针对大规模并发和分布式系统设计的编程语言,它的并发模型、分布式特性、热代码升级和容错性使其在电信、云计算等领域有着独特的价值。通过深入学习Erlang,开发者可以掌握构建可扩展、...

    Erlang中的注册进程使用实例

    总结来说,Erlang中的注册进程是通过`register/2`函数将原子名与进程PID绑定,从而在全局作用域内使用原子名代替PID进行通信,简化了代码,并提高了代码的可读性。这种机制是Erlang并发编程中一个重要的工具,使得...

    erlang官方资源包

    总结起来,"otp_src_21.3.tar.gz"是一个包含Erlang OTP框架源代码的压缩包,对于理解Erlang并发模型、开发基于OTP的系统以及搭建RabbitMQ服务器至关重要。通过学习和使用这些资源,开发者可以构建出高效、健壮的...

    适用于windows版本的 Erlang25.2.3 and RabbitMQ server 3.11.9下载

    总结来说,Erlang 25.2.3和RabbitMQ Server 3.11.9是用于构建高效、可靠的分布式消息系统的重要工具,尤其在Java开发中,它们能够帮助我们实现灵活的异步通信,提高系统的可扩展性和稳定性。通过深入学习和实践,...

    一个我自己学习Erlang的聊天室服务器及客户端代码

    4. 消息传递:Erlang进程间通过消息传递进行通信,这在聊天室服务器中尤为关键。服务器进程会监听来自客户端的消息,如发送的文本、加入或离开房间的通知,然后将这些消息广播给其他在线用户。 二、Java聊天室...

    Programming Erlang.pdf

    在Erlang中,程序通过多个轻量级进程(Lightweight Processes)实现并发,每个进程都可以独立运行,并行执行任务。这种设计使得Erlang非常适合处理大量并发连接,如网络服务。 ### 3. Erlang与思维模型 文件中提到...

    erlang 入门练习

    Erlang进程之间的独立性使得即使某个进程崩溃,其他进程也能继续运行,从而保证系统的整体稳定性。 Erlang还提供了丰富的标准库,如`io`模块用于输入输出,`lists`模块提供了各种列表操作,`erlang`模块包含了...

    Erlang22.3和RabbitMQ3.8.4.zip

    总结来说,Erlang22.3和RabbitMQ3.8.4的组合是构建可靠、高性能消息队列服务的理想选择。Erlang提供的并发性、分布式特性和容错能力,与RabbitMQ的消息传递功能相结合,为企业级应用提供了强大的基础架构。无论是...

    Erlang语言介绍[E文]下

    - **预抢占式调度**:Erlang 的虚拟机负责进程的调度,采用预抢占式的调度策略,这意味着虚拟机会根据需要自动切换进程,而无需依赖于操作系统。 #### 三、函数示例 为了更好地理解 Erlang 中的进程如何工作,我们...

Global site tag (gtag.js) - Google Analytics