"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > هل يحترم json.NewDecoder().Decode() المواعيد النهائية للسياق عندما يتم تخزين أجسام الاستجابة مؤقتًا؟

هل يحترم json.NewDecoder().Decode() المواعيد النهائية للسياق عندما يتم تخزين أجسام الاستجابة مؤقتًا؟

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

 Does json.NewDecoder().Decode() Respect Context Deadlines When Response Bodies are Buffered?

Go json.NewDecoder().Decode() مشكلة الموعد النهائي للسياق

في برامج Go، توفر المواعيد النهائية للسياق وسيلة لتحديد المهلات لـ Go عمليات معينة. ومع ذلك، أبلغ أحد المستخدمين عن سلوك غير متوقع عند استخدام json.NewDecoder().Decode().

مخاوف المستخدم

توقع المستخدم json.NewDecoder(). Decode() لاحترام الموعد النهائي المحدد للبرنامج. لاحظوا أن القراءة من نص الاستجابة باستخدام ioutil.ReadAll() أدت إلى حدوث خطأ تجاوز الموعد النهائي للسياق، كما كان متوقعًا. ومع ذلك، عندما قاموا بالتبديل إلى json.NewDecoder().Decode()، لم يتم الإبلاغ عن أي خطأ، على الرغم من تجاوز الوقت المنقضي للموعد النهائي.

مثال التعليمات البرمجية

ctx, _ := context.WithTimeout(context.Background(), time.Second*5)

req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
...

time.Sleep(time.Second * 6)
fmt.Println("before reading response body, context error is:", ctx.Err())
err = json.NewDecoder(resp.Body).Decode(ipResponse)
if err != nil {
    panic(err)
}
fmt.Println("Expected panic but there was none")

إجابة

ينبع التناقض في السلوك من استخدام المخازن المؤقتة داخل حزمة net/http. اعتمادًا على حجم الاستجابة وتكوينها، قد يتم تخزين النص مؤقتًا جزئيًا أو كليًا قبل قراءته. هذا يعني أنه عند استخدام json.NewDecoder().Decode()، قد لا يمنع السياق منتهي الصلاحية من الوصول إلى البيانات المخزنة مؤقتًا.

لتوضيح ذلك، تم إنشاء خادم اختبار أدى إلى تأخير نص الاستجابة عمدًا . لقد قام بمحاكاة سلوك التخزين المؤقت الجزئي لحزمة net/http. عندما تم تنفيذ readDoesntFail() مع خادم الاختبار هذا، تم بالفعل تشغيل خطأ تجاوز الموعد النهائي للسياق المتوقع.

الاستنتاج

يسلط السلوك الذي لوحظ في كود المستخدم الضوء على الإمكانات تحذيرات من استخدام json.NewDecoder().Decode() مع المواعيد النهائية للسياق. من المهم أن تدرك أنه إذا كان نص الاستجابة كبيرًا وتم تخزينه مؤقتًا بالكامل، فقد لا يتم تنفيذ الموعد النهائي للسياق كما هو متوقع.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3