आप एक कमांड-लाइन बॉट विकसित कर रहे हैं जो 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) को कई बार कॉल कर रहे हैं:
जब सर्वर अभी भी कनेक्शन सुन रहा हो तब srv.Shutdown को कॉल करने से रेस की स्थिति पैदा हो जाती है। लिसनएंडसर्व() गोरोइन खुले श्रोताओं और निष्क्रिय कनेक्शनों को बंद करने का प्रयास करता है, लेकिन हैंडलर क्लोजर में शटडाउन के बाद के कॉल से यह बाधित हो जाता है। यह राज्य असंगतता घबराहट को ट्रिगर करती है।
इस समस्या को हल करने के लिए, आप दो तरीकों में से एक का उपयोग कर सकते हैं:
1. context.WithCancel का उपयोग करें:
इस दृष्टिकोण में, आप एक cancel फ़ंक्शन के साथ एक context.Context बनाते हैं। संदर्भ लिसनएंडसर्व गोरआउटिन और शोटोकनटूयूजर हैंडलर फ़ंक्शन को भेज दिया गया है। हैंडलर के अंदर, जब उपयोगकर्ता को एक्सेस टोकन प्रदर्शित किया गया है, तो आप संदर्भ को समाप्त करने के लिए रद्द फ़ंक्शन को कॉल करते हैं। जब संदर्भ रद्द हो जाता है तो लिसनएंडसर्व गोरोइन सर्वर को शालीनता से बंद कर देगा।
2। समान Context का उपयोग करें:
context.WithCancel को कॉल करने के बजाय, आप उसी context.Context को लिसनएंडसर्व गोरोइन और हैंडलर फ़ंक्शन में पास कर सकते हैं। जब एक्सेस टोकन प्रदर्शित होता है, तो आप संदर्भ पर cancel() को कॉल करते हैं, जो हैंडलर और लिसनएंडसर्व गोरोइन दोनों को बंद कर देगा।
किसी भी दृष्टिकोण को लागू करने के बाद, srv.Shutdown फ़ंक्शन की प्रतीक्षा करना याद रखें प्रोग्राम से बाहर निकलने से पहले पूरा करना।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3