UDP套接字写入会阻塞吗?
那么,如果是这样的话,在哪些情况下可以呢?换句话说,把问题换个方式问,这段代码在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支持呢?