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: