चलो कहते हैं कि मैं एक सॉकेट से एक लाइन में पढ़ना चाहते हैं, मानक socket
मॉड्यूल का उपयोग करते हैं:अजगर सॉकेट बफरिंग
def read_line(s):
ret = ''
while True:
c = s.recv(1)
if c == '\n' or c == '':
break
else:
ret += c
return ret
वास्तव में क्या s.recv(1)
में क्या होता है? क्या यह हर बार एक सिस्टम कॉल जारी करेगा? मुझे लगता है मैं कुछ बफरिंग, वैसे भी जोड़ना चाहिए लगता है:
हार्डवेयर और नेटवर्क वास्तविकताओं, 2 की एक अपेक्षाकृत छोटी शक्ति होना चाहिए bufsize का मूल्य, उदाहरण के लिए के साथ सबसे अच्छा मैच के लिए, 4096.
http://docs.python.org/library/socket.html#socket.socket.recv
लेकिन यह कुशल और थ्रेड-सुरक्षित बफरिंग लिखना आसान नहीं लगता है। अगर मैं file.readline()
का उपयोग करता हूं तो क्या होगा?
# does this work well, is it efficiently buffered?
s.makefile().readline()
"क्या यह हर बार सिस्टम कॉल जारी करेगा?" यह बात क्यों है? –
क्योंकि सिस्टम कॉल धीमी हैं। डेटा का एक बड़ा हिस्सा (यदि उपलब्ध हो) लाने के लिए बेहतर है, तो इसे संसाधित करें। अब मुझे पता है कि पायथन विशेष रूप से तेज़ नहीं है, और शायद यह वास्तव में कोई फर्क नहीं पड़ता। लेकिन दस्तावेज कहता है कि वैसे भी बड़े हिस्सों द्वारा पढ़ना बेहतर होता है। –
ध्यान दें कि '+ =' का उपयोग करके एक स्ट्रिंग का निर्माण करना कोई संख्या नहीं है क्योंकि यह संभावित रूप से वर्गबद्ध है, जबकि अंत में 'str.join' का उपयोग करके एक सूची बनाना हमेशा रैखिक होता है। –