`

[练习]erlang实现生产者与消费者

 
阅读更多

原来写过一个....我都忘记了..

http://fair-jm.iteye.com/blog/1894288

以上这个不对啊..看了下和所谓的生产者消费者差的远了..什么玩意儿(╯‵□′)╯︵┴─┴

 

..

%% @author cc fairjm
%% @doc @todo Add description to Producer_Consumer.


-module(producer_consumer).

%% ====================================================================
%% API functions
%% ====================================================================
-export([start/0,consume/0, produce/0,rec/1]).
-define(SERVER,?MODULE).
-define(NUM,100).
%% ====================================================================
%% Internal functions
%% ====================================================================
start() ->
 Pid=spawn(?MODULE,rec,[0]),
 case whereis(?MODULE) of
	 undefined -> register(?SERVER,Pid);
	 _Other -> unregister(?SERVER),register(?SERVER,Pid)
 end,
 Pid
.

rec(0) ->
	receive
       {put,Pid} -> Pid ! {put_success,1},rec(1)
	end
;

rec(?NUM) ->
	receive 
	  {get,Pid} -> Pid ! {get_success,?NUM-1},rec(?NUM-1)
	end
;

rec(N) ->
	receive 
		{get,Pid} -> Pid ! {get_success,N-1},rec(N-1);
		{put,Pid} -> Pid ! {put_success,N+1},rec(N+1)
    end
.
%%同步消费
consume()->
		SPid=self(),
		?SERVER ! {get,SPid},
		receive 
			{get_success,Num} -> io:format("get successed count:~p~n", [Num]);
				        _Other ->	io:format("get failed~n")
        end,
	ok
.

%%同步生产
produce()->
		SPid=self(),
		?SERVER ! {put,SPid},
		receive
			{put_success,Num} -> io:format("put successed count:~p~n", [Num]);
			            _Other ->	io:format("put failed~n")
        end,
	ok
.

 以上这个...还有点像样..

 

使用同步的生产和消费 小于等于0时 消费者堵塞  大于等于100时 生产者堵塞

 

erlang中的receive机制挺好的 如果你发送的消息不符合当前在堵塞的receive 就不会被取出 依旧在"信箱"里 等到有匹配的receive堵塞之后再重新被拿出

 

运行:



 

  • 大小: 78.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics