UDP套接字写入会阻塞吗?

14 投票
2 回答
1893 浏览
提问于 2025-04-17 13:33

那么,如果是这样的话,在哪些情况下可以呢?换句话说,把问题换个方式问,这段代码在twisted里面运行安全吗?

class StatsdClient(AbstractStatsdClient):
  def __init__(self, host, port):
    super(StatsdClient, self).__init__()
    self.addr = (host, port)
    self.server_hostname = socket.gethostname()
    self.udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

  def incr(self, stat, amount=1):
    data = {"%s|c" % stat: amount}
    self._send(data)

  def _send(self, data):
    for stat, value in data.iteritems():
      self.udp_sock.sendto("servers.%s.%s:%s" % (self.server_hostname, stat, value), self.addr)

2 个回答

-1

如果你的网络接口出现问题,这个操作可能会失败,比如说:

[ENETDOWN] 用来连接目标的本地网络接口已经关闭。

9

是的,奇怪的是,UDP套接字有时候会阻塞。

这种情况发生的原因主要是某些缓冲区满了,你的操作系统决定是时候让某些操作阻塞了。这种情况可以说是内核的bug,但我偶尔也见过。你确实可能在一些奇怪、难以重现的情况下遇到EWOULDBLOCK这个错误。

不过,为什么你会想在Twisted中这样做,而不是直接使用Twisted的内置UDP支持呢?

撰写回答