"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية إيقاف تشغيل خادم HTTP بشكل أنيق بعد إرجاع الرد؟

كيفية إيقاف تشغيل خادم HTTP بشكل أنيق بعد إرجاع الرد؟

تم النشر بتاريخ 2024-11-07
تصفح:294

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

إيقاف تشغيل خادم HTTP بعد إرجاع الاستجابة

أنت تقوم بتطوير روبوت سطر أوامر يتفاعل مع 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) عدة مرات:

  1. في معالج showTokenToUser، حيث يقع داخل منطقة إغلاق.
  2. بعد انتهاء المعالج من التنفيذ في الوظيفة الرئيسية.

استدعاء 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