gpt4 book ai didi

sockets - 在哪种情况下,我们应该在Erlang中使用混合方法套接字?

转载 作者:行者123 更新时间:2023-12-03 11:51:06 25 4
gpt4 key购买 nike

Programing Erlang在第17.2章中说

Erlang sockets can be opened in one of three modes: active, active once, or passive



...

You might think that using passive mode for all servers is the correct approach. Unfortunately, when we’re in passive mode, we can wait for the data from only one socket. This is useless for writing servers that must wait for data from multiple sockets.



我只是不明白句子 ,这对于编写必须等待来自多个套接字的数据的服务器是没有用的

我认为,如果我不能说服客户,则不应使用主动模式。

但是我可以为每个客户端(具有一个客户端的一个Erlng进程)制作一个具有被动模式的并行服务器。

也许它说一个用于多个套接字的Erlang进程。但是我无法想象这种情况的例子。

您能给我更多的信息吗?

谢谢!

最佳答案

Unfortunately, when we’re in passive mode, we can wait for the data from only one socket. This is useless for writing servers that must wait for data from multiple sockets.



我会说,这不是针对被动套接字的非常有说服力的论点。在几乎所有情况下,每个套接字都会有一个Erlang进程,并且不会出现此问题。

反对被动套接字的一个更好的论据是,在等待数据(使用 gen_tcp:recv)时,该进程无法从其他Erlang进程接收消息。这些消息可能是计算,关闭请求等的结果。

也就是说,当使用主动或主动一次模式时,您的 receive看起来像这样:
receive
{tcp, Socket, Data} ->
%% do something with Data
%% then reactivate the socket
ok = inet:setopts(Socket, [{active,once}]),
loop(Socket);
{result, Result} ->
%% send Result back to socket
ok = gen_tcp:send(Socket, Result),
loop(Socket);
stop ->
%% stop this process
exit(normal)
end

使用此代码,无论到达的事件是套接字上的传入数据还是来自另一个Erlang进程的消息,无论哪个事件首先到达,都将首先对其进行处理。

另一方面,如果您使用 gen_tcp:recv接收数据,则将阻止该调用,无法及时响应 {result, Result}stop

关于sockets - 在哪种情况下,我们应该在Erlang中使用混合方法套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32049395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com