2013-01-24 12 views
14

और यदि हां, तो किस स्थितियों में?कभी भी यूडीपी सॉकेट को लिखना ब्लॉक कर सकता है?

[ENETDOWN] स्थानीय नेटवर्क का इस्तेमाल किया इंटरफ़ेस तक पहुँचने के लिए: उदाहरण के लिए अपने नेटवर्क इंटरफेस नीचे चला जाता है, तो

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

हां, विचित्र रूप से, एक यूडीपी सॉकेट ब्लॉक कर सकता है।

जो परिस्थितियां हो सकती हैं, वे मूल रूप से कुछ बफर कहीं भरते हैं, आपका ऑपरेटिंग सिस्टम कुछ समय के लिए ब्लॉक करने का निर्णय लेता है। ये तर्कसंगत कर्नेल कीड़े हैं, लेकिन मैंने उन्हें यहां और वहां देखा है। आप निश्चित रूप से अस्पष्ट, असंभव-पुन: उत्पन्न करने वाली स्थितियों के तहत EWOULDBLOCK प्राप्त कर सकते हैं।

हालांकि आप ट्विस्टेड built-in UDP support का उपयोग करने के बजाय ट्विस्ट में ऐसा क्यों करना चाहते हैं?

+3

इसके अलावा, पायथन-विशेष रूप से, यदि "होस्ट" को हल करने की आवश्यकता है, तो पाइथन यूडीपी सॉकेट की स्थिति के बावजूद, आपके लिए उस संकल्प को खुशी से कर देगा। –

+2

ओह हाँ, और संबंधित-आश की तरह, मुझे लगता है, 'socket.gethostname' भी ब्लॉक कर सकता है! –

-1

यह विफल हो सकता है,: या, बारी-बारी से phrased, यह सुरक्षित मुड़ के अंदर इस कोड को चलाने के लिए है गंतव्य नीचे है।

+3

यह एक विफलता की स्थिति है, अवरुद्ध स्थिति नहीं। – zigg

+0

दोह, सच है कि, क्षमा करें, मैं गलत पढ़ता हूं। – saghul

संबंधित मुद्दे