2013-01-24 20 views
14

もしそうなら、どんな条件の下で?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) 
+0

私はそれがデフォルトでブロックされていると信じて、 'self.udp_sock.setblocking(0)'を非ブロックに設定する必要があります。この場合、データをすぐに送信できないと例外が発生します。 – imreal

答えて

9

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

これが起こる条件は、基本的に、どこかのバッファがいっぱいになると、オペレーティングシステムが何かブロックする時間を決定します。これらはおそらくカーネルのバグですが、私はそれらをこことそこに見ました。ときどきEWOULDBLOCKを、時には不明瞭で、再生不可能な状態で得ることができます。

Twistedの代わりに012stを使用するのはなぜですか?

+3

また、Pythonでは、具体的には、「ホスト」を解決する必要がある場合、PythonはUDPソケットの状態に関係なく、幸いにもその解決策をブロックします。 –

+2

ああ、そして関連する仲間のようなもの、私は、 'socket.gethostname'もブロックできると思います! –

-1

は、それは失敗する可能性があり、ネットワークインタフェースがダウンした場合、例えば:

[ENETDOWN]使用するローカルネットワークインタフェースが到達するか、交互言い回し、それはツイストの内部でこのコードを実行しても安全です目的地はダウンしています。

+3

これは障害条件であり、ブロック条件ではありません。 – zigg

+0

Doh、本当のこと、申し訳ありませんが、私は誤解しました。 – saghul

関連する問題