[練習]erlangは生産者と消費者を実現する

2568 ワード

もとは1つ书いたことがあります....私はすべて忘れました..
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が詰まってから再び出されます.
 
実行:
[练习]erlang实现生产者与消费者_第1张图片