Erlang-实现进程环

M是消息传递数目,N进程数量,Msg是传递的消息

-module(exe3_2).
-export([start/3,stop/0]).

start(M,N,Msg) ->register(ring,spawn(fun()->ring_service(M,N,Msg) end)).

stop() -> ring!stop.

ring_service(M,N,Msg) ->
    Ring=ring_node(N,[]),%Ring是进程环
    send_msg(M,Msg,Ring),
    receive
        stop -> stop_ring(Ring)
    end.

stop_ring([]) ->ok;
stop_ring([H|T]) ->H!stop,
                 stop_ring(T).

send_msg(0,_Msg,_Ring) ->ok;
send_msg(M,Msg,[H|T]) ->H ! {msg,M,Msg},
                        send_msg(M-1,Msg,T ++ [H]).

ring_node(N,Ring) when N>0
                    ->Next_Pid = spawn(fun() ->loop() end),
                    ring_node(N-1,[Next_Pid|Ring]);
ring_node(0,Ring) ->lists:reverse(Ring).

loop() ->
        receive
            {msg,M,Msg} ->
                io:format("~w:~w:~w~n",[self(),M,Msg]),
                loop();
            stop ->true
        end.
时间: 2024-10-19 08:29:15

Erlang-实现进程环的相关文章

erlang监控进程在启动进程退出后异常退出原因分析

一.问题引出 erlang监控进程在启动时设置了trap_exit为true,即会捕获到退出信号,会将退出信号转换为{'EXIT',Pid,Reason}存入自己的邮箱中,因此与监控进程link关系的进程退出后,监控进程能够很坦然的截获退出信号,自身不退出.启动erlang监控进程的进程,会和监控进程建立link关系,然而当启动进程退出时,监控进程没有象正常的情况,发生了异常退出,为什么设置了trap_exit为true,还会退出呢? 二.原因分析 查看supervisor的源码,supervi

[Erlang]link进程信号详解

原创文章,转载请注明出处:服务器非业余研究http://blog.csdn.net/erlib 作者Sunface 联系邮箱:[email protected] 估计很多同学都会对link时各种信号及捕捉机制有点迷糊,我这边在画一个表格,特分享给大家 Reason Trapping exits (trap_exit = true) Not trapping exits (trap_exit = false) normal Receives {'EXIT', Pid, Normal} Nothin

erlang链接进程之间的关系

1.process_flag(trap_exit,false),是默认行为:   “A进程”和“B进程”相互链接,(1)如果“A进程”异常退出“B进程”也随之退出:(2)如果“A进程”正常退出,“B进程”不做任何处理,继续运行.2.process_flag(trap_exit,true):  “A进程”和“B进程”相互链接,“B进程”设置了process_flag(trap_exit,true),这样“B进程”接受到“A进程”的退出信号,并自行处理. 捕获进程退出的编程模式: 模式一:我不在乎创

erlang的进程字典

语法@spec put(Key,Value) ->OldValue.@spec get(Key)->Value.@spec get()->[{Key,Value}].@spec get_keys(Value)->[Key].@spec erase(Key)->Value.@spec erase()->[{Key,Value}].

关于erlang中的进程字典(process dictionary)的新理解及其访问速度 (copy来的)

之前对于erlang的进程字典了解的不够清楚,只是知道put().get()函数,即存值和取值,而每个put.get中都有自己的一对Key--Value(键值对)与之对应.一个Key对应一个Value.在erlang中,启动进程节点之后,进程字典的put.get的值是对缓存的处理,而对数据库的操作,相当于是对硬盘的一个操作,可以理解成是一个数据的备份. 举个简单的例子:在游戏中都有好友操作,启动服务之后,玩家点击添加好友操作,进程的节点已经开启,先从内存中获取玩家的进程字典的Value的值,这里

Erlang基础 -- 介绍 -- 历史及Erlang并发

前言 最近在总结一些Erlang编程语言的基础知识,拟系统的介绍Erlang编程语言,从基础到进阶,然后再做Erlang编程语言有意思的库的分析. 其实,还是希望越来越多的人关注Erlang,使用Erlang,壮大Erlang编程语言的社区. 说实话,我也没这么高尚,就是看到很多人对Erlang编程语言的误解,Erlang编程语言社区的凋零,招个Erlang开发难之又难,才萌生此念. 这次主要介绍Erlang编程语言.包括Erlang的简要历史以及应用场景,Erlang并发编程,Erlang编程

进程/线程死锁产生的原因以及如何避免死锁

线程死锁产生的必要条件: (1)互斥条件:一个资源每次只能被一个进程使用. (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺. (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系. 如何避免死锁,这点我觉得Erlang模型值得参考.在编程过程中,有一些避免死锁的经验: (1) 等待某个资源时,使用超时机制(例如Erlang中的receive可以加一个超时): (2) 采用消息通信的通信机

[Erlang]通用的erlang优化设置

设置是我在多个项目中通用的,不过根据应用场景的不同,还会有其它细调,就不在这一一说明了.  - Sunface  一. erl启动时参数: +K true 开启epoll调度,在linux中开启epoll,会大大增加调度的效率 +A 100 异步线程池,为某些port调用服务 +P 1024000 最大进程数 +Q 65535 最大port数 +sbt db 绑定调度器,绑定后调度器的任务队列不会在各个CPU线程之间跃迁,结合sub使用,可以让CPU负载均衡的同时也避免了大量的跃迁发生. 注意:

Erlang EPMD

 epmd进程和Erlang节点进程如影随形,在Rabbitmq集群,Ejabberd集群,Couchbase集群产品文档中都会有相当多的内容讲epmd,epmd是什么呢?   epmd 是Erlang Port Mapper Daemon的缩写,全称足够明确表达它的功能了(相比之下,OTP就是一个难以从字面理解的名字);epmd完成Erlang节点和IP,端口的映射关系,比如在我的测试机上, [[email protected] data2]# epmd -names epmd: up and