【问题标题】:Can writing to a UDP socket ever block?写入 UDP 套接字会阻塞吗?
【发布时间】:2013-01-24 17:18:38
【问题描述】:

如果是这样,在什么条件下?或者,换个说法,在 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)

【问题讨论】:

  • 我相信它默认是阻塞的,你必须使用self.udp_sock.setblocking(0)将其设置为非阻塞,在这种情况下如果它不能立即发送数据就会引发异常。

标签: python udp twisted statsd


【解决方案1】:

是的,奇怪的是,UDP 套接字可以阻塞。

发生这种情况的条件基本上是,某处的某些缓冲区已满,您的操作系统决定是时候阻止某些东西了。这些可以说是内核错误,但我在这里和那里看到过它们。有时在晦涩难懂、无法复制的条件下,您绝对可以得到EWOULDBLOCK

您为什么要在 Twisted 中执行此操作而不是使用 Twisted 的 built-in UDP support

【讨论】:

  • 另外,特别是 Python,如果需要解析“主机”,那么无论 UDP 套接字的状态如何,Python 都会很高兴地为您完成该解析。
  • 哦,是的,还有一些相关的,我猜,socket.gethostname 也可以阻止!
【解决方案2】:

如果您的网络接口出现故障,它可能会失败,例如:

[ENETDOWN] 用于到达目的地的本地网络接口已关闭。

【讨论】:

  • 这是失败条件,不是阻塞条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2010-11-23
  • 2011-09-12
  • 1970-01-01
  • 2015-08-28
  • 2014-06-27
相关资源
最近更新 更多