2013-01-04 15 views
5

में समय लेने वाली आरईएसटी सेवा के साथ त्रुटि मैं सेवा में भाग लेने के लिए कोड लिख रहा हूं। मुझे किसी विशेष सेवा के लिए POST अनुरोध प्राप्त होते हैं और प्रसंस्करण शुरू करते हैं। पूरी प्रक्रिया अपेक्षाकृत सरल है; मैं अनुरोध में लूप आइटम को लूप करता हूं और प्रत्येक आइटम को डेटाबेस में जोड़ता हूं। समस्या पैदा होती है जब मैं बहुत से आइटम पर कार्रवाई करने के लिए है और तीन मिनट के खत्म करने के लिए की तरह पाश जब मैं प्रतिक्रिया करने के लिए कोशिश लेता है, तो:पायथन

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

मैं डॉन:

status = '200 OK' 
headers = [('Content-type', 'application/json'),('Access-Control-Allow-Origin','*')] 
start_response(status, headers) 

return json.dumps(response) 

मैं इस त्रुटि मिलती है यह नहीं पता कि यह मदद करता है, लेकिन POST अनुरोध ब्राउज़र से एक अलग डोमेन पर एक अग्रेषित पोस्ट है (यही कारण है कि एक एक्सेस-कंट्रोल-ऑब्जेक्ट-ओरिजिनिन) और डेटाबेस में सभी एक्सेस एक ऑब्जेक्ट का उपयोग करके बनाई जाती हैं SQLAlchemy का उपयोग कर डेटाबेस के साथ इंटरैक्ट करता है (Java EEDAO पैटर्न के समान देखा जा सकता है)।

मैं इस त्रुटि से कैसे बचूं?

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/10253288/django-development-server-broken: http प्रतिक्रिया कोड की एक पूरी अवलोकन के लिए इस लिंक का अनुसरण -पाइप-त्रुटि) – miku

+0

आप इसे असीमित बना सकते हैं। जैसे ही सभी डेटा यहां है, आप एक टोकन वापस भेजते हैं कि डेटा प्राप्त होता है और क्लाइंट साइड पर आप "लोड हो रहा है ..." संदेश प्रदर्शित कर सकते हैं। यदि डेटा अपलोड करना समाप्त हो गया है, तो क्लाइंट समय-समय पर अद्यतनों की जांच करें, और फिर एक बार समाप्त हो जाने पर, आप पूर्ण एक प्रदर्शित करते हैं। –

+0

आमतौर पर जब मुझे टूटा हुआ पाइप त्रुटि मिलती है, तो यह कुछ बेवकूफ है, क्लाइंट की तरह समय समाप्त हो गया था जब मैं सर्वर कोड डीबग कर रहा था। यदि प्रक्रिया को तीन मिनट से अधिक समय लगता है, तो प्रक्रिया को असंकालिक रूप से किया जाना चाहिए और आपको यह पुष्टि करने का जवाब देना चाहिए कि प्रक्रिया को तब तक प्रतीक्षा करने के बजाय सफलतापूर्वक शुरू किया गया है जब तक कि प्रतिक्रिया करने के लिए प्रक्रिया पूरी नहीं हो जाती। –

उत्तर

5

आप शायद आरईएसटी के पीछे विचार का उल्लंघन कर रहे हैं।

यदि प्रसंस्करण में कुछ समय लग सकता है, तो सेवा 202 Accepted प्रतिक्रिया के साथ इसका उत्तर देना चाह सकती है! http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

202 Accepted

The request has been accepted for processing, but the processing has not been completed. The request might or might not eventually be acted upon, as it might be disallowed when processing actually takes place. There is no facility for re-sending a status code from an asynchronous operation such as this.

The 202 response is intentionally non-committal. Its purpose is to allow a server to accept a request for some other process (perhaps a batch-oriented process that is only run once per day) without requiring that the user agent's connection to the server persist until the process is completed. The entity returned with this response SHOULD include an indication of the request's current status and either a pointer to a status monitor or some estimate of when the user can expect the request to be fulfilled.

[Django विकास सर्वर टूटी पाइप त्रुटि] (की
+0

आप सही हो सकते हैं, 202 ध्वनि एक अच्छा विचार की तरह है, फिर भी मैं 202 के साथ कैसे प्रतिक्रिया दे सकता हूं और एक ही समय में अनुरोध को संसाधित करना शुरू कर सकता हूं? –

+0

आमतौर पर आप एक थ्रेड लॉन्च करते हैं। इसकी पूर्णता पर इसे संसाधन बनाना चाहिए, जिसे प्राप्तकर्ताओं द्वारा एक्सेस किया जा सकता है। – sschrass

+0

इस मामले में, एक एसिंक्रोनस प्रक्रिया लॉन्च करना आप चाहते हैं, अगर अनुरोध का उत्तर देने में लंबा समय लगता है। 202 कोड सबसे अच्छा समाधान की तरह लगता है। तो, आप प्रक्रिया लॉन्च करते हैं, फिर 202 लौटते हैं और पृष्ठभूमि में प्रसंस्करण जारी रखते हैं। –

2

मैं गलत हो सकता था, लेकिन यह मुझे लगता है जैसे सॉकेट समय समाप्त हो रहा है। आपको क्लाइंट को तीन मिनट से अधिक प्रतिक्रिया के लिए फांसी नहीं छोड़नी चाहिए।

इसके बजाय, आपको डेटा को सत्यापित करना चाहिए और यह संदेश भेजना चाहिए कि यह प्राप्त हुआ था। यदि आवश्यक हो, तो आप क्लाइंट को यह बताने के लिए AJAX की तरह कुछ उपयोग कर सकते हैं कि डेटा प्राप्त होने के बाद दर्ज किया गया था।

+0

वास्तव में आप सही हैं, समस्या यह है कि समय में जवाब कैसे दिया जाए (या 202 जैसे सैटेलाइट एसडी उत्तर दिया गया हो) और अनुरोध को संसाधित करें। –