32 टूटे हुए पाइप को कैसे रोकें?


120

वर्तमान में मैं अजगर में निर्मित एक ऐप का उपयोग कर रहा हूं। जब मैं इसे पर्सनल कंप्यूटर में चलाता हूं, तो यह बिना किसी समस्या के काम करता है।

हालांकि, जब मैं इसे एक प्रोडक्शन सर्वर में ले जाता हूं। यह मुझे नीचे के रूप में संलग्न त्रुटि दिखाता रहता है:

मैंने कुछ शोध किया है और मुझे यह कारण मिला कि एंड यूज़र ब्राउज़र कनेक्शन बंद कर देता है जबकि सर्वर अभी भी डेटा भेजने में व्यस्त है।

मुझे आश्चर्य है कि ऐसा क्यों हुआ और क्या मूल कारण है जो इसे उत्पादन सर्वर में ठीक से चलने से रोकता है, जबकि यह मेरे व्यक्तिगत कंप्यूटर पर काम करता है। किसी भी सलाह की सराहना की है

    Exception happened during processing of request from ('127.0.0.1', 34226)
Traceback (most recent call last):
  File "/usr/lib/python2.7/SocketServer.py", line 284, in
_handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 310, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python2.7/SocketServer.py", line 641, in __init__
    self.finish()
  File "/usr/lib/python2.7/SocketServer.py", line 694, in finish
    self.wfile.flush()
  File "/usr/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe

क्या यह आपके मुद्दे को हल करता है ?
प्योरफ्रेट

या uwsgi के साथ कनेक्ट करें, आदि
KyungHoon Kim

जवाबों:


85

आपकी सर्वर प्रक्रिया को SIGPIPEसॉकेट के लिए एक लेखन मिला है । यह आमतौर पर तब होता है जब आप दूसरे (क्लाइंट) पक्ष पर पूरी तरह से बंद एक सॉकेट को लिखते हैं। यह तब हो सकता है जब क्लाइंट प्रोग्राम सर्वर के सभी डेटा प्राप्त होने तक प्रतीक्षा नहीं करता है और बस एक सॉकेट बंद कर देता है ( closeफ़ंक्शन का उपयोग करके )।

सी प्रोग्राम में आप आमतौर पर SIGPIPEसिग्नल को नजरअंदाज करने या इसके लिए डमी सिग्नल हैंडलर सेट करने की कोशिश करते हैं। इस स्थिति में एक बंद सॉकेट पर लिखते समय एक साधारण त्रुटि वापस आ जाएगी। आपके मामले में एक अजगर एक अपवाद को फेंक देता है जिसे क्लाइंट के समय से पहले डिस्कनेक्ट के रूप में नियंत्रित किया जा सकता है।


2
क्लाइंट डिसकनेक्ट से निपटने के बारे में यहाँ एक अच्छा जवाब है: stackoverflow.com/a/180922/276274
मक्सीम स्केरडज़िन

9

यह इस बात पर निर्भर करता है कि आपने इसे कैसे परीक्षण किया है, और संभवतः व्यक्तिगत कंप्यूटर और सर्वर के टीसीपी स्टैक कार्यान्वयन में अंतर पर।

उदाहरण के लिए, यदि आपका sendallपर्सनल कंप्यूटर पर तुरंत (या बहुत जल्दी) पूरा हो जाता है, तो कनेक्शन भेजने के दौरान बस कभी नहीं टूट सकता है। यह बहुत संभावना है अगर आपका ब्राउज़र एक ही मशीन पर चल रहा है (क्योंकि कोई वास्तविक नेटवर्क विलंबता नहीं है)।


सामान्य तौर पर, आपको केवल उस मामले को संभालने की आवश्यकता होती है, जहां क्लाइंट समाप्त होने से पहले डिस्कनेक्ट कर देता है।

याद रखें कि टीसीपी संचार अतुल्यकालिक हैं, लेकिन यह स्थानीय लोगों की तुलना में शारीरिक रूप से दूरस्थ कनेक्शन पर बहुत अधिक स्पष्ट है, इसलिए इस तरह की स्थिति स्थानीय वर्कस्टेशन पर पुन: पेश करना मुश्किल हो सकती है। विशेष रूप से, एक मशीन पर लूपबैक कनेक्शन अक्सर लगभग तुल्यकालिक होते हैं।


मैं इसे "paster serve abc.ini --reload" चलाकर परीक्षण कर रहा हूं, हालांकि वेबपेज पर कभी नहीं पहुंचा जा सकता। और VMWare वर्कस्टेशन के लिए, मैं नेटवर्क कनेक्शन के लिए केवल होस्ट विकल्प का उपयोग कर रहा हूं। तो क्या आप इसे ठीक से चलाने के लिए किसी भी तरह की सलाह दे सकते हैं?
SƲmmēr Aƥ

1
मुझे लगता है कि एक अलग VMWare नेटवर्क कॉन्फिग प्रश्न है (मुझे डर है कि मुझे इस बारे में कुछ भी पता नहीं है)। वर्कस्टेशन और सर्वर के अलग-अलग व्यवहार करने का कारण हालांकि ऊपर है, और इसका समाधान केवल अपवाद को संभालने के लिए हैtry ... except
Useless

7

टूटी हुई पाइप की त्रुटि आमतौर पर तब होती है जब आपका अनुरोध अवरुद्ध हो जाता है या रिक्वेस्ट-साइड टाइमआउट के बाद बहुत देर हो जाती है, यह कनेक्शन बंद कर देगा और फिर, जब प्रतिक्रिया-पक्ष (सर्वर) सॉकेट पर लिखने की कोशिश करेगा, तो यह एक कुंजी फेंक देगा पाइप टूटी हुई त्रुटि।


3

यह हो सकता है क्योंकि आप डेटाबेस में डेटा डालने के लिए दो विधि का उपयोग कर रहे हैं और यह साइट को धीमा करने का कारण बनता है।

def add_subscriber(request, email=None):
    if request.method == 'POST':
        email = request.POST['email_field']
        e = Subscriber.objects.create(email=email).save()  <==== 
        return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')

उपरोक्त फ़ंक्शन में, वह त्रुटि है जहां तीर इंगित कर रहा है। सही कार्यान्वयन नीचे है:

def add_subscriber(request, email=None):
    if request.method == 'POST':
        email = request.POST['email_field']
        e = Subscriber.objects.create(email=email)
        return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.