Erlang入门:进程实例操作与练习1

%% @author Rolong<rolong at vip dot qq dot com>

-module(process1).
-compile(export_all).

-define(I(F), io:format(F++"~n", [])).
-define(I(F, A), io:format(F++"~n", A)).

%% Usage:
%%
%% 启动进程:Pid = process1:start(Fun).
%%           Fun = fun1 | fun3 | fun3 ...
%%
%% 发送消息  Pid ! Message.
%%           Message = term()

start(Fun)->
    spawn(?MODULE,Fun,[]).

%%'-------- fun --------

%%'fun1 进程立即结束
%% 用erlang:is_process_alive(Pid)检查进程是否存在
fun1()->
    ?I("I'm fun1.~n").
%%.

%%'fun2 进程收到一个消息后结束
%% 用erlang:is_process_alive(Pid)检查进程是否存在
%% 发送消息:Pid ! message
fun2()->
    receive
        Msg ->
            ?I("I'm fun2, received: p", [Msg])
    end.  
%%.

%%'fun3 进程不会结束
%% 结束方法:
%% exit(Pid, Reason)
fun3()->
    receive
        Msg ->
            ?I("I'm fun3, received: p", [Msg]),
            %% 回调自己
            fun3()
    end.
%%.

%%'fun4 增加结束方法
%% 进程收到stop消息后结束
%% 结束方法:
%% 1、 exit(Pid, Reason)
%% 2、 Pid ! stop
fun4()->
    receive
        stop ->
            ?I("fun4 received stop."),
            %% 不再回调自己,进程结束
            ok;
        Msg ->
            ?I("I'm fun4, received: p", [Msg]),
            %% 回调自己
            fun4()
    end.
%%.

%%'fun5 增加询问功能
%% 询问方法:Pid ! who
fun5()->
    receive
        who ->
            ?I("I'm fun5~n"),
            fun5();
        stop ->
            ok;
        Msg ->
            ?I("I'm fun1, receive: p", [Msg]),
            fun5()
    end.
%%.

%%'fun6 进程不会处理处理stop以外的任何消息
%% 未处理的消息会累积在进程消息队列里
%% 用erlang:process_info(Pid)查看进程信息
fun6()->
    receive
        stop -> ok
    end.
%%.

%%'fun7 增加超时处理,超时后结束
%% 进程在8秒内没有收到任何消息就结束
fun7()->
    receive
        Msg ->
            ?I("I'm fun7, receive: ~p", [Msg]),
            fun7()
    after 
        8000 -> ?I("I'm fun7, timeout, STOP.~n")
    end.
%%.

%%'fun8 增加超时处理,超时后不结束
%% 进程在8秒内没有收到任何消息就结束
fun8()->
    receive
        Msg ->
            ?I("I'm fun8(~w), receive: ~p", [self(), Msg]),
            fun8()
    after 
        5000 -> 
            ?I("I'm fun8(~w), 5s elapsed, waiting for you...", [self()]),
            fun8()
    end.
%%.

%%.fun end

%% vim: set filetype=erlang foldmarker=%%',%%. foldmethod=marker:

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。