أنت تقوم بتطوير روبوت سطر أوامر يتفاعل مع Instagram API باستخدام OAuth، وهو غير مُحسّن لسطر الأوامر التطبيقات. للتغلب على ذلك، قمت بإعداد خادم HTTP محلي باعتباره URI لإعادة التوجيه للتخويل. بعد أن يقوم المستخدم بتفويض التطبيق وإعادة توجيهه إلى الخادم، ترغب في إيقاف تشغيل الخادم بمجرد عرض رمز الوصول.
لقد واجهت مشكلة عند تنفيذ آلية إيقاف التشغيل. على وجه التحديد، يؤدي استدعاء srv.Shutdown(nil) في معالج الطلب (showTokenToUser) إلى خطأ:
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 بينما الخادم لا يزال يستمع للاتصالات يؤدي إلى حالة سباق. يحاول روتين الاستماع AndServe() إغلاق المستمعين المفتوحين والاتصالات الخاملة، ولكن تتم مقاطعته بواسطة الاستدعاء اللاحق لإيقاف التشغيل في إغلاق المعالج. يؤدي عدم تناسق الحالة إلى إثارة حالة من الذعر.
لحل هذه المشكلة، يمكنك استخدام إحدى الطريقتين:
1. استخدم context.WithCancel:
في هذا الأسلوب، يمكنك إنشاء context.Context باستخدام وظيفة الإلغاء. يتم تمرير السياق إلى روتين الاستماع AndServe ووظيفة معالج showTokenToUser. داخل المعالج، عندما يتم عرض رمز الوصول للمستخدم، يمكنك استدعاء وظيفة الإلغاء لإنهاء السياق. سوف يقوم نظام ListAndServe بإغلاق الخادم بأمان عند إلغاء السياق.
2. استخدم نفس السياق:
بدلاً من استدعاء context.WithCancel، يمكنك تمرير نفس السياق.Context إلى نظام الاستماع AndServe ووظيفة المعالج. عندما يتم عرض رمز الوصول، يمكنك استدعاء Cancel() في السياق، مما سيؤدي إلى إيقاف تشغيل كل من المعالج ونظام الاستماع AndServe.
بعد تنفيذ أي من الطريقتين، تذكر انتظار وظيفة srv.Shutdown لإكمالها قبل الخروج من البرنامج.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3