Может ли запись в UDP-сокет когда-либо блокироваться? - программирование
Подтвердить что ты не робот

Может ли запись в UDP-сокет когда-либо блокироваться?

И если да, то при каких условиях? Или, выражаясь поочередно, безопасно запускать этот код внутри скрученного:

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)
4b9b3361

Ответ 1

Да, странно, сокет UDP может блокироваться.

Условия, при которых это может произойти, в основном, некоторые буферы где-то заполняются, ваша операционная система решает это время для блокировки. Это, возможно, ядровые ошибки, но я видел их здесь и там. Вы можете определенно получить EWOULDBLOCK иногда в неясных, невозможных для воспроизведения условиях.

Почему вы хотите сделать это в Twisted вместо использования Twisted встроенной поддержки UDP, хотя?

Ответ 2

Он может выйти из строя, если ваш сетевой интерфейс не работает, например:

[ENETDOWN] Интерфейс локальной сети, используемый для достижения пункта назначения, не работает.