- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在看 Programming Erlang 2E .在第 17 章的 Active and Passive Sockets 中,它说:
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.
Fortunately, we can adopt a hybrid approach, neither blocking nor nonblocking. We open the socket with the option {active, once}. In this mode, the socket is active but for only one message. After the controlling processes has been sent a message, it must explicitly call inet:setopts to reenable reception of the next message. The system will block until this happens. This is the best of both worlds.
% passive mode
loop(Socket) ->
case gen_tcp:recv(Socket, N) of
{ok, B} ->
... do something with the data ...
loop(Socket);
{error, closed}
...
end.
% once mode
loop(Socket) ->
receive
{tcp, Socket, Data} ->
... do something with the data ...
%% when you're ready enable the next message
inet:setopts(Sock, [{active, once}]),
loop(Socket);
{tcp_closed, Socket} ->
...
end.
gen_tcp:recv
在
passive
模式本质上与
receive
做同样的事情在
once
模式。怎么样
once
模式修复
passive
的这个问题模式:
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.
最佳答案
主要区别在于您何时选择对该套接字上的事件使用react。使用主动套接字,您的进程会收到一条消息,使用被动套接字,您必须自行决定调用 gen_tcp:recv
.这对你意味着什么?
编写 Erlang 程序的典型方法是让它们对事件使用react。遵循这个主题,大多数 Erlang 进程等待代表外部事件的消息,并根据它们的性质对它们使用react。当您使用事件套接字时,您能够以与其他事件完全相同的方式处理套接字数据的方式进行编程:作为 Erlang 消息。当您使用被动套接字进行编写时,您必须选择何时检查套接字以查看它是否有数据,并就何时检查 Erlang 消息做出不同的选择——换句话说,您最终不得不编写轮询例程,并且这错过了 Erlang 的大部分优势。
所以active_once
之间的区别和 active
...
使用事件套接字,任何能够建立连接的外部参与者都可以用数据包轰炸进程,无论系统是否能够跟上。如果您想象一个服务器有 1000 个并发连接,其中每个数据包的接收都需要进行一些重要的计算或访问其他一些有限的外部资源(这不是一个奇怪的场景),您最终不得不选择如何处理过载。
只有 active
您已经做出选择的套接字:您将让服务降级,直到事情开始失败(超时或其他情况)。
与 active_once
sockets 你有机会做出一些选择。安 active_once
socket 允许你在 socket 上接收一条消息并设置它 passive
再次,直到您将其重置为 active_once
.这意味着您可以编写一个阻塞/同步调用来检查整个系统继续处理消息是否安全,并将其插入到处理结束和下一个 receive
的开始之间。监听套接字——甚至选择进入 receive
在系统过载的情况下无需重新激活套接字,但您的进程同时需要处理其他 Erlang 消息。
想象一个名为 sysmon
的命名进程驻留在此节点上并检查外部数据库是否过载。您的进程可以接收数据包,对其进行处理,并在允许套接字向其发送另一条消息之前让系统监视器知道它已准备好进行更多工作。系统监视器还可以向监听进程发送消息,告诉它们在监听数据包时暂时停止接收数据包,这对于 gen_tcp:recv
来说是不可能的。方法(因为您要么接收套接字数据,要么检查 Erlang 消息,但不能同时接收两者):
loop(S = {Socket, OtherState}) ->
sysmon ! {self(), ready},
receive
{tcp, Socket, Data} ->
ok = process_data(Data, OtherState),
loop(S);
{tcp_closed, Socket} ->
retire(OtherState),
ok;
{sysmon, activate} ->
inet:setopts(Socket, [{active, once}]),
loop(S);
{sysmon, deactivate} ->
inet:setopts(Socket, [{active, false}]),
loop(S);
{other, message} ->
system_stuff(OtherState),
loop(S)
end.
关于erlang - gen_tcp的passive和once模式的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27784622/
我有以下 CDI 托管 bean: @Named @SessionScoped public class InfoPageController implements Serializable {
我正在使用 dragula js 在移动设备中使用拖放功能,突然遇到了一个问题,出现以下错误。 [Intervention] Unable to preventDefault inside passi
我正在使用 Google Page Speed Insights优化我的页面速度。它告诉我不要使用被动监听器来提高滚动性能。我知道如何使用 Vanilla javascript 来做到这一点。 win
我们使用独立的集群 JMS 服务器托管集群应用程序服务器。应用程序服务器是主动/主动且负载平衡的,而JMS服务器是主动/被动(共享存储)并使用操作系统集群。这意味着从客户端的角度来看,每个端点只有一个
我正在使用锤子进行拖动,加载其他东西时它变得不稳定,正如这条警告消息告诉我的那样。 Handling of 'touchstart' input event was delayed for X ms
我正在使用锤子进行拖动,并且在加载其他内容时它变得不稳定,正如此警告消息所告诉我的那样。 Handling of 'touchstart' input event was delayed for X
因为有两个关于被动和主动 FTP 模式的问题 Passive FTP instead of Active FTP What is the difference between active and p
我发现自己经常创建一个没有公共(public)方法且自包含的对象。它通常处理在其私有(private)方法中传递给其构造函数的参数事件,并且不会引发任何事件或公开任何公共(public)方法。 我称这
引用此 post我已经成功地获得了一个 Linux 设备(Raspberry Pi Model A+)来将我的蓝牙 4.0 USB 加密狗切换到“广告”状态: sudo hciconfig hci0
我们制定了每晚将文件上传到合作伙伴 FTP 站点的流程。他们现在需要被动连接,我们的上传现在失败了。 .NET 4 FtpWebRequest 是否可以实现被动连接而不是主动连接?如果是这样,有人可以
我使用 Chrome 扩展来修改缩放增量,它在控制台中抛出此错误: Added non-passive event listener to a scroll-blocking 'mousewheel'
随着 Chrome 的最新更新[73],他们改变了被动事件监听器与鼠标滚轮在窗口对象上的工作方式。基本上,这已经破坏了许多平滑滚动插件,这些插件在 Chrome 中滚动时消除了传统鼠标滚轮的默认“抖动
我正在 Ubuntu 中使用套接字编程 C++ 编写服务器客户端程序。 这是连接客户端和服务器的代码。 void setParent(string name,int parentPort){
我正在使用 Owin WsFederation 身份验证。对于未经授权的用户,我希望一条路径重定向到 STS,另一条路径返回 401 响应。是否可以为不同的路径设置不同的AuthenticationM
似乎 Microsoft ADFSv2 支持 WS-Trust 和 SAML Passive,但它所构建的 WIF 堆栈不支持 SAML。 WS-Trust 和 SAML-P 有什么区别?它们是否具有
“Presenter First”MVP 模式与“Passive View”一样吗?如果不是,它们有什么不同? 最佳答案 也许我错了,但据我所知: 演示者优先方法中使用的 mvp 模式是围绕 Mart
我正在尝试使用在 Android 模拟器中运行的 Java FTPSClient 从本地 FileZilla 服务器下载文件。 我编写了这个帮助程序代码来下载一个文件: public boolean
我正在尝试使用在 Android 模拟器中运行的 Java FTPSClient 从本地 FileZilla 服务器下载文件。 我写了这个帮助代码来下载一个文件: public boolean dow
我无法解决我在客户站点遇到的这个问题。客户端有两个站点,并且都运行相同版本的我的应用程序。在一个站点上没有问题,但在另一个站点上,当我尝试从 FTP 站点下载文件时,我开始不断收到以下错误: "227
例如,模板中有一个元素使用局部变量#targetElement,目的是在需要时获取其当前宽度。但我不想以编程方式计算样式。尝试使用带有 @ViewChild 注释的 setter get: 从模板中获
我是一名优秀的程序员,十分优秀!