"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > प्रतिक्रिया देने के बाद HTTP सर्वर को शालीनतापूर्वक कैसे बंद करें?

प्रतिक्रिया देने के बाद HTTP सर्वर को शालीनतापूर्वक कैसे बंद करें?

2024-11-07 को प्रकाशित
ब्राउज़ करें:149

How to Gracefully Shut Down an HTTP Server After Returning a Response?

प्रतिक्रिया लौटाने के बाद HTTP सर्वर को बंद करना

आप एक कमांड-लाइन बॉट विकसित कर रहे हैं जो OAuth का उपयोग करके इंस्टाग्राम एपीआई के साथ इंटरैक्ट करता है, जो कमांड-लाइन के लिए अनुकूलित नहीं है अनुप्रयोग. इसे दूर करने के लिए, आपने प्राधिकरण के लिए रीडायरेक्ट यूआरआई के रूप में एक स्थानीय HTTP सर्वर स्थापित किया है। उपयोगकर्ता द्वारा एप्लिकेशन को अधिकृत करने और सर्वर पर रीडायरेक्ट करने के बाद, एक्सेस टोकन प्रदर्शित होने के बाद आप सर्वर को बंद करना चाहेंगे।

शटडाउन तंत्र को लागू करते समय आपको एक समस्या का सामना करना पड़ा है। विशेष रूप से, अनुरोध हैंडलर (showTokenToUser) में srv.Shutdown(nil) को कॉल करने से एक त्रुटि उत्पन्न होती है:

2017/11/23 16:02:03 Httpserver: ListenAndServe() error: http: Server closed
2017/11/23 16:02:03 http: panic serving [::1]:61793: runtime error: invalid memory address or nil pointer dereference

समाधान

समस्या इसलिए उत्पन्न होती है क्योंकि आप srv.Shutdown(nil) को कई बार कॉल कर रहे हैं:

  1. showTokenToUser हैंडलर में, जहां यह एक क्लोजर के भीतर स्थित है।
  2. हैंडलर द्वारा मुख्य फ़ंक्शन में निष्पादन पूरा करने के बाद।

जब सर्वर अभी भी कनेक्शन सुन रहा हो तब srv.Shutdown को कॉल करने से रेस की स्थिति पैदा हो जाती है। लिसनएंडसर्व() गोरोइन खुले श्रोताओं और निष्क्रिय कनेक्शनों को बंद करने का प्रयास करता है, लेकिन हैंडलर क्लोजर में शटडाउन के बाद के कॉल से यह बाधित हो जाता है। यह राज्य असंगतता घबराहट को ट्रिगर करती है।

इस समस्या को हल करने के लिए, आप दो तरीकों में से एक का उपयोग कर सकते हैं:

1. context.WithCancel का उपयोग करें:

इस दृष्टिकोण में, आप एक cancel फ़ंक्शन के साथ एक context.Context बनाते हैं। संदर्भ लिसनएंडसर्व गोरआउटिन और शोटोकनटूयूजर हैंडलर फ़ंक्शन को भेज दिया गया है। हैंडलर के अंदर, जब उपयोगकर्ता को एक्सेस टोकन प्रदर्शित किया गया है, तो आप संदर्भ को समाप्त करने के लिए रद्द फ़ंक्शन को कॉल करते हैं। जब संदर्भ रद्द हो जाता है तो लिसनएंडसर्व गोरोइन सर्वर को शालीनता से बंद कर देगा।

2। समान Context का उपयोग करें:

context.WithCancel को कॉल करने के बजाय, आप उसी context.Context को लिसनएंडसर्व गोरोइन और हैंडलर फ़ंक्शन में पास कर सकते हैं। जब एक्सेस टोकन प्रदर्शित होता है, तो आप संदर्भ पर cancel() को कॉल करते हैं, जो हैंडलर और लिसनएंडसर्व गोरोइन दोनों को बंद कर देगा।

किसी भी दृष्टिकोण को लागू करने के बाद, srv.Shutdown फ़ंक्शन की प्रतीक्षा करना याद रखें प्रोग्राम से बाहर निकलने से पहले पूरा करना।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3