سؤال

لديّ خندي بيثون يعمل في الإنتاج. توظف ما بين 7 و 120 خيوط. في الآونة الأخيرة ، بدأت أصغر مثيل (7 مؤشرات ترابط) تظهر معلقة بينما لم تظهر جميع الحالات الأخرى هذا النوع من المشكلات. يوضح إرفاق Strace بعملية Python أن جميع المواضيع تدعو FUTEX_WAIT_PRIVAL ، لذلك ربما يحاولون قفل شيء ما.

كيف يمكنك تصحيح مثل هذه المشكلة؟

لاحظ أن هذا نظام إنتاج يعمل من ذاكرة الفلاش ، لذلك يتم تقييد كتابة القرص أيضًا.

هل كانت مفيدة؟

المحلول

كانت الملاحظة غير صحيحة بعض الشيء. لم يكن موضوع واحد يتصل بـ Futex ، ولكن بدلاً من ذلك يبديل أثناء حمل GIL. نظرًا لأن الجهاز المعني هو الأجهزة المنخفضة ، فقد استغرق هذا التبديل وقتًا طويلاً ويبدو أنه كان مسدود. المشكلة الأساسية هي تسرب الذاكرة. :-(

نصائح أخرى

عزيزي Helmut ، لدي نفس المشكلة مع موضوع واحد معلق على Futext_Wait_Privin.

يبدو أنك حلت المشكلة. هل يمكنك مشاركة المزيد من المعلومات حول الحل؟

UPD:

تم العثور على سبب القفل أخيرًا (على الأقل لحالتي): كان ذلك بسبب قفل الاستيراد في Python.

النظر في الموقف التالي:

file1.py:

استيراد File2

file2.py:

إنشاء موضوع "Thread2"

تشغيل "Thread2"

انتظر حتى النهاية "Thread2" مع بعض الوظائف (دعنا نقول Go Go ())

def go ():

استيراد some_module

....

هنا سيتم تعليق الاستيراد في Go () نظرًا لأن الاستيراد مغلق في الخيط الرئيسي (عن طريق File2) والذي لن يتم إصداره حتى ينتهي Go (). سيرى المستخدم في Strace Hang على FUTEX_WAIT_PRIVAL.

للعمل حول هذا المكان ، تم تنفيذ الكود أثناء استيراد File2 إلى وظيفة () وتشغيله بعد استيراد File2:

استيراد File2

file2.do ()

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top