Networking {active,false},{active,true}和{active,once}之间有什么区别?

Networking {active,false},{active,true}和{active,once}之间有什么区别?,networking,tcp,erlang,elixir,gen-tcp,Networking,Tcp,Erlang,Elixir,Gen Tcp,您可能知道,gen_tcp有三种模式{active,false},{active,true}和{active,once} 我读过一些关于{active,false},{active,true}和{active,once}的文档。然而,我没有得到它 {active,false}和{active,true}和{active,once}之间有什么区别 你能解释清楚吗?{active,false} 您必须通过调用gen_tcp:recv()从套接字读取数据块 {active,true} Erlang会自

您可能知道,gen_tcp有三种模式<代码>{active,false},
{active,true}
{active,once}

我读过一些关于
{active,false}
{active,true}
{active,once}
的文档。然而,我没有得到它

{active,false}
{active,true}
{active,once}
之间有什么区别


你能解释清楚吗?

{active,false}
您必须通过调用gen_tcp:recv()从套接字读取数据块

{active,true}
Erlang会自动从套接字中读取数据块,并将这些数据块收集到完整的消息中,然后将消息放入进程邮箱中。您可以使用
receive
子句读取消息。如果某个恶意参与者向您的邮箱发送大量邮件,您的进程将崩溃

{活动,一次}
对于从套接字读取的第一个数据块,相当于
{active,true}
,对于任何后续数据块,相当于
{active,false}


您还需要了解指定
{packet,N}
是如何影响事情的。请参见此处:

{active,false}
您必须通过调用gen_tcp:recv()从套接字读取数据块

{active,true}
Erlang会自动从套接字中读取数据块,并将这些数据块收集到完整的消息中,然后将消息放入进程邮箱中。您可以使用
receive
子句读取消息。如果某个恶意参与者向您的邮箱发送大量邮件,您的进程将崩溃

{活动,一次}
对于从套接字读取的第一个数据块,相当于
{active,true}
,对于任何后续数据块,相当于
{active,false}


您还需要了解指定
{packet,N}
是如何影响事情的。请参见此处:

这是关于流量控制的:您有一个Erlang进程来处理传入的网络流量。通常,您希望它对传入的数据包做出快速反应,但您不希望其消息队列的增长速度超过其处理速度,但在某些情况下,您会有不同的目标

使用
{active,false}
,您可以明确控制进程何时接收传入流量:只有在调用
gen_tcp:recv
时才会发生这种情况。但是,当进程在
gen_tcp:recv
中等待时,它无法接收其他Erlang消息。也许其他一些Erlang进程正在发送一条消息,告诉它停止,但它还不知道,因为它正在集中精力获取网络输入

使用
{active,true}
,一旦网络输入可用,就会将其作为消息发送到进程。这意味着您可以有一个
receive
表达式,该表达式既需要网络流量,也需要来自其他进程的简单Erlang消息。如果您确信流程处理输入的速度比到达输入的速度快,那么这种操作模式可能会很有用,但最终可能会出现一个永远不会被清除的长消息队列

{active,once}
是两者之间的折衷:您以Erlang消息的形式接收传入数据,这意味着您可以将网络流量与其他工作混合,但在收到数据包后,您需要再次使用
{active,once}
显式调用
inet:setopts
,以接收更多数据,因此,您可以决定流程接收消息的速度


自从Erlang/OTP17.0以来,还有另一个选项,
{active,N}
,其中N是一个整数。这意味着您可以在再次调用
inet:setopts
之前接收
N
消息。这可以在不必放弃流量控制的情况下提供更高的吞吐量。

这是关于流量控制的:您有一个Erlang进程来处理传入的网络流量。通常,您希望它对传入的数据包做出快速反应,但您不希望其消息队列的增长速度超过其处理速度,但在某些情况下,您会有不同的目标

使用
{active,false}
,您可以明确控制进程何时接收传入流量:只有在调用
gen_tcp:recv
时才会发生这种情况。但是,当进程在
gen_tcp:recv
中等待时,它无法接收其他Erlang消息。也许其他一些Erlang进程正在发送一条消息,告诉它停止,但它还不知道,因为它正在集中精力获取网络输入

使用
{active,true}
,一旦网络输入可用,就会将其作为消息发送到进程。这意味着您可以有一个
receive
表达式,该表达式既需要网络流量,也需要来自其他进程的简单Erlang消息。如果您确信流程处理输入的速度比到达输入的速度快,那么这种操作模式可能会很有用,但最终可能会出现一个永远不会被清除的长消息队列

{active,once}
是两者之间的折衷:您以Erlang消息的形式接收传入数据,这意味着您可以将网络流量与其他工作混合,但在收到数据包后,您需要再次使用
{active,once}
显式调用
inet:setopts
,以接收更多数据,因此,您可以决定流程接收消息的速度

自从Erlang/OTP17.0以来,还有另一个选项,
{active,N}
,其中N是一个整数。这意味着您可以在再次调用
inet:setopts
之前接收
N
消息。这可以在不放弃流量控制的情况下提供更高的吞吐量。

(链接在gen_tcp文档中)很好地解释了这一点。你读过了吗?有什么你不明白的吗?(链接在gen_tcp文档中)对此进行了解释