Eralng 学习笔记第六天, Fun,进程,电子邮件,数据库,端口
Erlang Fun 示例:
-module(helloworld).
-export([start/0]).
start() ->
A = fun(X) ->
io:fwrite("~p~n",[X])
end,
A(5).
输出 5
---------------------------------------------------
-module(helloworld).
-export([start/0]).
start() ->
Adder = fun(X) -> fun(Y) -> io:fwrite("~p~n",[X + Y]) end end,
A = Adder(6),
A(10).
输出 16
Erlang 进程
Erlang中的并发粒度是一个过程。流程是与其他流程同时运行并独立于其他流程的活动/任务。Erlang中的这些过程与大多数人所熟悉的过程和线程不同。Erlang进程是轻量级的,与其他进程(内存)隔离运行,并且由Erlang的虚拟机(VM)调度。进程的创建时间非常短,刚生成的进程的内存占用非常小,单个Erlang VM可以运行数百万个进程。
语法: spawn(Module, Name, Args) 参数 Module - 这是预定义的原子值,必须为 ?MODULE , Name-这是定义流程时要调用的函数名称 , Args - 这些是需要发送给函数的参数
-module(helloworld).
-export([start/0, call/2]).
call(Arg1, Arg2) ->
io:format("~p ~p~n", [Arg1, Arg2]).
start() ->
Pid = spawn(?MODULE, call, ["hello", "process"]),
io:fwrite("~p",[Pid]).
关于上述程序,需要注意以下几点。
-
定义了一个称为call的函数,该函数将用于创建过程。
-
spawn方法使用参数hello和process调用call函数。
输出结果 : <0.29.0>"hello" "process"
Erlang 电子邮件
要使用Erlang发送电子邮件,您需要使用来自github的可用软件包。github链接是-https: //github.com/Vagabond/gen_smtp
Erlang 数据库
演示如何在Erlang中使用 emysql
库连接到 MySQL 数据库并执行查询操作:
例子:
-module(database_example).
-export([start/0]).
start() ->
%% 连接到 MySQL 数据库
{ok, Conn} = emysql:add_connection_pool(<<"my_pool">>, [{host, "localhost"}, {user, "username"}, {password, "password"}, {database, "my_database"}]),
%% 执行查询
Query = <<"SELECT * FROM my_table">>,
{ok, Result} = emysql:execute(<<"my_pool">>, Query),
%% 处理查询结果
case Result of
{selected, Rows} ->
%% 打印查询结果
lists:foreach(fun(Row) -> io:format("~p~n", [Row]) end, Rows);
_ ->
io:format("No rows selected.~n")
end,
%% 关闭连接
ok = emysql:close_connection_pool(<<"my_pool">>).
在这个例子中,我们首先使用 emysql:add_connection_pool/2
函数建立与 MySQL 数据库的连接池,然后执行一个简单的 SELECT 查询。
查询结果会被打印到控制台上。最后,我们使用 emysql:close_connection_pool/1
函数关闭连接池。
在实际项目中,你需要将 username
、password
、host
、database
和 my_table
替换为你的 MySQL 数据库的实际参数。
Erlang 端口
TCP(传输控制协议)和UDP(用户数据报协议)是两种常用的网络传输协议,它们在数据传输方式和特性上有明显的区别:
-
TCP(传输控制协议):
- 面向连接:TCP是一种面向连接的协议,通信双方在数据传输之前需要建立连接,并在连接上进行数据的可靠传输。
- 可靠性:TCP提供可靠的数据传输服务,确保数据的完整性、有序性和可靠性。它通过序列号、确认应答和重传机制来实现数据的可靠传输。
- 流式传输:TCP采用流式传输方式,将数据视为字节流进行传输,保证数据按顺序到达接收端,并提供流量控制和拥塞控制机制。
- 连接管理:TCP连接的建立和维护需要消耗一定的资源,包括三次握手建立连接和四次挥手关闭连接等过程。
-
UDP(用户数据报协议):
- 无连接:UDP是一种无连接的协议,通信双方之间不需要建立连接,数据在发送端封装成数据报后直接发送给接收端,不需要等待确认应答。
- 不可靠性:UDP提供不可靠的数据传输服务,不保证数据的完整性和可靠性。它不提供重传机制,数据可能会丢失或乱序到达接收端。
- 数据报传输:UDP采用数据报传输方式,将数据封装成数据报进行传输,每个数据报都是独立的,没有顺序要求,也没有拥塞控制机制。
- 低延迟:由于无连接和不可靠性,UDP传输延迟较低,适用于对实时性要求较高的应用场景。
如何使用这两种协议取决于具体的应用需求和场景:
- 如果对数据的完整性和可靠性要求较高,例如文件传输、网页浏览等应用,建议使用TCP协议。
- 如果对实时性要求较高,例如实时音视频传输、在线游戏等应用,可以考虑使用UDP协议。
- 有时也会根据应用的特点结合使用两种协议,例如TCP用于稳定的数据传输,UDP用于实时的数据传输。
接下来是一个简单的Erlang示例,演示如何使用TCP和UDP协议进行简单的数据传输。
TCP协议示例:
-module(tcp_example).
-export([server/0, client/0]).
server() ->
{ok, ListenSocket} = gen_tcp:listen(12345, [{active, false}]),
{ok, Socket} = gen_tcp:accept(ListenSocket),
gen_tcp:recv(Socket, 0).
client() ->
{ok, Socket} = gen_tcp:connect("localhost", 12345, []),
gen_tcp:send(Socket, "Hello, TCP!").
UDP协议示例:
-module(udp_example).
-export([server/0, client/0]).
server() ->
{ok, Socket} = gen_udp:open(12345, [{active, once}]),
receive
{udp, Socket, _, _, Data} ->
io:format("Received UDP data: ~s~n", [Data])
end.
client() ->
{ok, Socket} = gen_udp:open(0),
gen_udp:send(Socket, "localhost", 12345, "Hello, UDP!").