14

もしそうなら、どのような条件下で?または、別の言い方をすれば、このコードを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)
4

2 に答える 2

9

はい、奇妙なことに、UDPソケットはブロックできます。

これが発生する可能性のある条件は、基本的に、どこかでいくつかのバッファがいっぱいになり、オペレーティングシステムが何かをブロックする時間であると判断することです。これらは間違いなくカーネルのバグですが、私はあちこちで見ました。EWOULDBLOCK時々、あいまいで再現不可能な状況に陥ることは間違いありません。

Twistedの組み込みUDPサポートを使用する代わりに、Twistedでこれを実行したいのはなぜですか?

于 2013-01-24T18:15:30.030 に答える
-1

たとえば、ネットワークインターフェイスがダウンすると、失敗する可能性があります。

[ENETDOWN]宛先に到達するために使用されるローカルネットワークインターフェイスがダウンしています。

于 2013-01-24T18:01:19.363 に答える