كما نعلم جميعًا ، فإن socket.send () لا يضمن إرسال جميع البيانات
وهذا الخط:
https://github.com/pallets/werkzeug/blob/03faf0569861e9d8c8c94785ad5560f735ba72da/werkzeug/serving.py#L165
جنبًا إلى جنب مع gevent وأكبر تقنية على نطاق الويب ، والمعروفة باسم docker ، قادني إلى هذا السلوك فقط مع اقتطاع الردود: 3
يبدو أن المقبس يجب أن يهتم به المقبس ، لكنه لا يفعل ذلك
بينما من المحتمل أنك على صواب (لم تقم بأي بحث) ، يرجى ملاحظة أن خادم Werkzeug مخصص للتطوير فقط. تشغيله في Docker ومع gevent يقودني إلى الاعتقاد بأنك لا تستخدمه لهذا الغرض.
لقد كنت في الواقع أستخدم عامل الإرساء للتطوير وجزء من الكود يستخدم gevent monkeypatches بشكل تافه.
ربما لن ألاحظ ذلك حتى لو لم يكسر اللامبالاة: 3
لقد واجهت هذا الخطأ في Python 3.5 ، ولكن فقط عند ضبط المقبس الأساسي على وضع عدم الحظر (على سبيل المثال مع settimeout
). اتضح أن هذا في الواقع ناتج عن خطأ في المنبع في Python 3: issue24291 . تم إصلاح المشكلة في Python 3.6 (راجع الإصدار 26721 )
الحل البديل الذي تم تنفيذه في خوادم الويب الأخرى هو التفاف wfile
في io.BufferedWriter
(على سبيل المثال في wsgiref CPython في 3.5 ) أو تغيير wbufsize
لتمكين التخزين المؤقت بواسطة الافتراضي (على سبيل المثال ، انظر هذه المشكلة )
لست متأكدًا مما إذا كان werkzeug يريد تنفيذ حل بديل أيضًا ، أو يعتبره مشكلة غير متعلقة بـ werkzeug.
بناءً على المعلومات المقدمة ، أعتقد أن هذا بالفعل إما خطأ gevent أو stdlib bug ، يستخدم werkzeug الكتابة + flush في ملف مخزن مؤقت مفترض ، والذي بدوره يجب أن يعمل دائمًا ، الآن أتساءل عما إذا كان هذا يحدث أيضًا على بيثون عادي ، أو فقط على gevent
RonnyPfannschmidt نعم ، أحصل عليه بدون gevent
أيضًا ، أحتاج فقط إلى استخدام مقبس غير مغلق مع werkzeug WSGIRequestHandler
. كان Gevent مجرد مثال آخر للعديد من المشاريع التي تأثرت بشكل غير مباشر بخلل المنبع في Python 3.5 :-)
نظرًا للظروف التي يحدث فيها هذا ، بالإضافة إلى حقيقة أنه تم إصلاحه في Python 3.5 (3.4 يذهب EOL في مارس) ، فإنني أغلق هذا.
التعليق الأكثر فائدة
لقد واجهت هذا الخطأ في Python 3.5 ، ولكن فقط عند ضبط المقبس الأساسي على وضع عدم الحظر (على سبيل المثال مع
settimeout
). اتضح أن هذا في الواقع ناتج عن خطأ في المنبع في Python 3: issue24291 . تم إصلاح المشكلة في Python 3.6 (راجع الإصدار 26721 )الحل البديل الذي تم تنفيذه في خوادم الويب الأخرى هو التفاف
wfile
فيio.BufferedWriter
(على سبيل المثال في wsgiref CPython في 3.5 ) أو تغييرwbufsize
لتمكين التخزين المؤقت بواسطة الافتراضي (على سبيل المثال ، انظر هذه المشكلة )لست متأكدًا مما إذا كان werkzeug يريد تنفيذ حل بديل أيضًا ، أو يعتبره مشكلة غير متعلقة بـ werkzeug.