4.2 Erlang世界观
一切皆进程
web服务器的架构
server(Client) ->
receive
{Client, close} ->
true;
{Client, Request} ->
Response = generate_response(Request),
Client ! {self(), Response},
server(Client);
after 10000 ->
Client ! {self(), close}
end.
web服务器代码
relay(Socket, Server, State) ->
receive
{tcp, Socket, Data} ->
case parse_request(State, Data) of
{completed, Request, Stat1} ->
Server ! {self(), {request, Request}},
relay(Socket, Server, State1);
{more, State1} ->
relay(Socket, Server, State1)
end;
{tcp_closed, Socket} ->
Server ! {self(), close};
{Server, close} ->
gen_tcp:close(Socket);
{Server, Response} ->
Data = format_response(Response),
gen_tcp:send(Socket, Data),
relay(Socket, Server, State);
{'EXIT', Server, _} ->
gen_tcp:close(Socket)
end.
全部http代码:
http://www.sics.se/~joe/tutorials/web_server/http_driver.erl
4.3错误处理
原则:
(1)让其它进程修复错误
(2)要么成功,要么死掉
(3)任其崩溃
(4)不用防御式编程
4.3.1其它进程修复错误
Pid1如果错误,向Pid2发送消息: {'EXIT',Pid, Why}, 不论Pid1和Pid2是否在一个机器上
如果是Pid1的机器死掉,则发送:{'EXIT', Pid, machine_died} ,
4.3.2工作者和监督者
工作者执行正常工作
监督者检查工作者,负责错误处理等
4.4任它崩溃
由于有监督进程负责修复错误,因此对工作进程是任它崩溃。
这里的错误,只意料之外的错误,如果是正常工作流程的一种情况,则不算错误
4.5显意
保证一个函数处理一个问题,要显而易见