http://www.iteye.com/article/60414
里面,谈到了半同步/半异步和领导者/追随者模式,在Erlang里面可以很简单得实现它
下面看看 half-sync/half-async 的例子
start() ->
case gen_tcp:listen(80, [binary,
{nodelay,true},
{packet, 0},
{reuseaddr, true},
{active, false}]) of
{ok, Listen} ->
io:format("Listning port 80 @ ~p~n", [self()]),
accept_loop(Listen);
Error -> io:format("Error occur: ~p~n", [Error])
end.
accept_loop(Listen) ->
case gen_tcp:accept(Listen) of
{ok, Socket} ->
io:format("Socket ~p connected~n", [Socket]),
spawn(?MODULE, handler, [Socket]),
accept_loop(Listen);
Other -> exit(oops)
end.
handler(Socket) ->
io:format("Waiting incoming message @ ~p~n", [self()]),
inet:setopts(Socket, [{nodelay,true}, {active, false}]),
case gen_tcp:recv(Socket, 0) of
{ok, Packet} ->
io:format("Receive msg ~p~n", [binary_to_list(Packet)]),
gen_tcp:send(Socket, Packet),
gen_tcp:close(Socket),
handler(Socket);
{error, Reason} ->
io:format("Socket ~p error ~p~n", [Socket, Reason])
end.
在许多“网络编程”的教程里面,都会给出类似这样的例子。首先当前线程先监听一个端口,然后accept外来Socket连接,并将Socket传递到新的线程中处理。在C、Java这样的语言中,创建一个线程的开销是很大的,一般来说,会使用线程池来处理短连接,一些Web Server就是基于这样的模式。然而在Erlang里面,创建一个Proces的开销极少,进程间切换完全在用户态实现,这样减少了用户态和核心态间切换的开销,使得这种模式成为了可能。
接下来是Leader/Followers模式
start2() ->
case gen_tcp:listen(81, [binary,
{nodelay,true},
{packet, 0},
{reuseaddr, true},
{active, false}]) of
{ok, Listen} ->
handler2(Listen);
Error -> io:format("Error occur: ~p~n", [Error])
end.
handler2(Listen) ->
io:format("Listning port 81 @ ~p~n", [self()]),
case gen_tcp:accept(Listen) of
{ok, Socket} ->
io:format("Socket ~p connected~n", [Socket]),
inet:setopts(Socket, [{nodelay,true}, {active, true}]),
spawn(?MODULE, handler2, [Listen]),
io:format("Waiting incoming message @ ~p~n", [self()]),
receive
{tcp, Socket, Bin} ->
io:format("Receive msg ~p~n", [binary_to_list(Bin)]),
gen_tcp:send(Socket, Bin),
gen_tcp:close(Socket);
{tcp_closed, Socket} ->
io:format("Socket ~p closed ~n", [Socket]);
Any ->
io:format("~p~n", [Any])
end;
Other ->
io:format("~p~n", [Other]),
exit(oops)
end.
当一个Socket连接建立后,就会将监听gen_tcp:accept/1的调用权转移到新的Process当中进行处理。
在这里,Leader Process 设置了这样一个参数
inet:setopts(Socket, [{nodelay,true}, {active, true}]),
在gen_tcp模块的文档中,有一段如下的说明
引用
Packets can be sent to the returned socket Socket using send/2. Packets sent from the peer are delivered as messages:
{tcp, Socket, Data}
unless {active, false} was specified in the option list for the listen socket, in which case packets are retrieved by calling recv/2.
当在gen_tcp:listen/2中使用了{active, true}参数,那么当接收到数据的时候,就会主动发送消息到调用gen_tcp:accept/1的Process中,否则需要使用 gen_tcp:recv 来阻塞获取。通过这样的方式,就可以灵活实现同步/异步接收Socket数据。
Erlang网络编程还有其他有趣的地方,接下来的笔记我会写写这方面的内容。
分享到:
相关推荐
标题中的"erlang-23.2.3-1.el7.x86_64.rpm"和"erlang-23.2.1-1.el7.x86_64.rpm.rar"代表了两个不同的Erlang版本。`.rpm`文件是用于Red Hat Enterprise Linux (RHEL) 和其衍生发行版如CentOS的软件包管理格式,而`....
error: /tmp/esl-erlang_26.0.2-1~alinux~3_x86_64.rpm : not an rpm package (or packape manifest): arning: /tmp/rabbitmg-erver 3.12.4-1 all.rpm: Header V4 RSA/SHA512 Signature, key ID 6026dfca: NOKEY ...
esl-erlang_25.0.3-1_centos_7_amd64.rpm erlang_25.0.3-1 rpm用于rabitmq基础环境安装
在标题"erlang-22.3-1.el7.x86_64.rpm"中,我们可以解读出几个关键信息: 1. **版本号**:22.3-1表示这是Erlang的一个特定版本,22.3是主版本号和次版本号,而-1可能代表修订或更新次数。 2. **操作系统兼容性**:...
在标题中的"erlang-18.3-1.el7.centos.x86_64.zip",我们看到的是Erlang的一个特定版本,18.3,针对64位的CentOS 7操作系统(el7)的安装包。这个版本的Erlang包含了必要的组件和服务,使得它能够在CentOS 7上稳定...
erlang-21.3-1.el7.x86_64.rpm rabbitmq基础语言环境。
erlang-24.3.3-1.el9.x86_64.rpm centos
erlang-24.0.3-1.el8.x86_64.rpm资源
erlang_23.0.2-1版本 centos7 64bit esl-erlang_23.0.2-1_centos_7_amd64.rpm
标题中的"erlang-19.0.4-1.el7.centos.x86_64.zip"揭示了我们讨论的是Erlang的一个特定版本——19.0.4,该版本针对的是Linux发行版CentOS 7的64位架构。Erlang的版本号通常包括主要版本号、次要版本号和补丁版本号,...
erlang-xmerl-22.3-1.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
erlang-19.0.4-1.el7.centos.x86_64.rpm ,官网的正式包
esl-erlang_24.2.1-1_centos_7_amd64.rpm
erlang-xmerl-23.0.2-2.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
erlang-20.3-1.el7.centos.x86_64.rpm
erlang 安装包。 rabbitmq 安装所需要的
erlang-23.2.1-1.el7.x86_64.rpm
erlang-erts-19.3.6.4-1.el7.x86_64.rpm
"erlang-rpm-21.3.4.zip"是一个包含Erlang版本21.3.4的RPM(Red Hat Package Manager)包的压缩文件,适用于Linux操作系统,尤其是基于RPM包管理系统的发行版,如CentOS、Fedora和RHEL等。 Erlang的主要特点包括: ...