2013-01-24 18 views
14

Và nếu có, trong điều kiện nào? Hoặc, phrased luân phiên, nó là an toàn để chạy mã này bên trong xoắn:Có thể ghi vào ổ cắm UDP bao giờ không?

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

Tôi tin rằng nó đang chặn theo mặc định và bạn phải sử dụng 'self.udp_sock.setblocking (0)' để đặt nó thành không chặn, trong trường hợp này nó sẽ tăng ngoại lệ nếu nó không thể gửi dữ liệu ngay lập tức. – imreal

Trả lời

9

Có, kỳ quặc, một ổ cắm UDP có thể chặn.

Các điều kiện mà theo đó điều này có thể xảy ra về cơ bản, một số bộ đệm ở đâu đó lấp đầy, hệ điều hành của bạn quyết định đã đến lúc chặn thứ gì đó. Đây được cho là lỗi hạt nhân, nhưng tôi đã nhìn thấy chúng ở đây và ở đó. Bạn chắc chắn có thể nhận được EWOULDBLOCK đôi khi trong điều kiện không rõ ràng, không thể sinh sản.

Tại sao bạn muốn thực hiện điều này trong Twisted thay vì sử dụng Twisted's built-in UDP support?

+3

Ngoài ra, đặc biệt là Python, nếu "host" cần phải được giải quyết, thì Python sẽ vui vẻ thực hiện độ phân giải đó cho bạn, ngăn chặn, bất kể trạng thái của socket UDP. –

+2

Oh yea, và loại liên quan-ish, tôi đoán, 'socket.gethostname' có thể chặn quá! –

-1

Nó có thể thất bại nếu giao diện mạng của bạn đi xuống, ví dụ:

[ENETDOWN] Giao diện mạng nội bộ sử dụng để đạt đích đến.

+3

Đó là tình trạng lỗi, không phải là điều kiện chặn. – zigg

+0

Doh, đúng vậy, xin lỗi, tôi đã đọc sai. – saghul