【问题标题】:Is gen_tcp:send/2 blocking?gen_tcp:send/2 是否阻塞?
【发布时间】:2014-06-02 06:50:57
【问题描述】:

gen_tcp:send() 是异步的吗?假设我将使用 gen_tcp:send/2 发送一些字节数组。进程是否会继续工作:

a) 立即
b)此时数据将到达目标的内部缓冲区
c) 当目标从缓冲区获取数据时

提前谢谢你。

【问题讨论】:

标签: tcp erlang


【解决方案1】:

gen_tcp:send/2 是同步的。这意味着只有在给定的数据包真正发送后调用才会返回。通常它会立即发生,但是如果 TCP 窗口已满,gen_tcp:send/2 会阻塞直到发送数据。所以这意味着调用理论上可以无限阻塞(例如,当接收器不从其一侧的套接字读取数据时)。 幸运的是,有一些选择可以避免这种情况。套接字有两个选项{send_timeout, Integer}{send_timeout_close, Boolean},可以通过调用inet:setopts/2 指定。第一个允许指定等待发送操作的最长时间。

超过限制时,发送操作将返回{error, timeout}。该选项的默认值为infinity(这是无限阻塞的原因)。同样不幸的是,如果返回{error, timeout},则不知道发送了多少数据。在这种情况下,最好关闭套接字。如果第二个选项{send_timeout_close, Boolean} 设置为true,那么当{error, timeout} 发生时,套接字将自动关闭。

【讨论】:

  • 因此,在大型服务器中,在一个进程的 foreach 循环中向所有客户端发送数据并不是一个好主意。对吗?
  • 这通常不一定是个好主意。从长远来看,为每个连接设置单独的进程通常更容易维护。
  • 更好的办法是在单独的进程中处理连接(每个连接一个进程)。
猜你喜欢
  • 2020-09-16
  • 2011-04-09
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多