هل لاحظت من قبل أن خادمك يبدو مثقلاً بالعمل حتى بعد انتهاء مهام Celery؟ توجد مشكلة شائعة تظهر مع قوائم انتظار المهام الموزعة مثل Celery، خاصة في بيئات الإنتاج المزدحمة.

الجوهر هو هذا: عندما يتم إخبار عملية عامل Celery بالإغلاق بسلاسة – ربما لتقليص الحجم أو للترتيب – تتلقى إشارة إنهاء (تسمى SIGTERM). تتوقع أن تغلق العمليات الفرعية معها، أليس كذلك؟ لكن بسبب خلل في كيفية تعامل Python والأنظمة القياسية مع الإشارات، فإن رسالة الإغلاق هذه غالباً لا تصل تلقائياً إلى العمليات الفرعية التي أنشأها عامل Celery. فكر في مهام مثل معالجة مقاطع الفيديو باستخدام `ffmpeg` أو تشغيل أمر `sleep` بسيط؛ هذه هي العمليات الفرعية.

هنا تظهر مشكلة «الزومبي». إذا أغلق عامل Celery الأم دون إخبار أبنائه أن يفعلوا الشيء نفسه، فإن تلك العمليات الفرعية لا تختفي ببساطة. بدلاً من ذلك، تصبح «يتيمة». يقوم نظام التشغيل الخاص بك بإعادة توجيهها إلى عملية النظام الرئيسية (PID 1). ثم تستمر هذه العمليات اليتيمة في العمل في الخلفية، وتواصل استنزاف الموارد القيمة مثل قوة وحدة المعالجة المركزية (CPU) والذاكرة وحتى اتصالات قاعدة البيانات. بفعالية، تصبح عمليات «زومبي» – إنها حية وتستهلك الموارد، لكنها لم تعد جزءاً من أي مهمة نشطة أو مُدارة.

هذا يؤدي إلى مشاكل حقيقية: ضعف الأداء، وعدم استقرار النظام، وإهدار الموارد.

يعمل المطورون بنشاط على معالجة هذا الأمر. ولمنع تسرب الموارد هذا، يتم تصميم طرق أكثر ذكاءً لإدارة هذه العمليات الفرعية. الفكرة هي ربط حياة العملية الفرعية ارتباطاً وثيقاً بعملية العامل الأم، لضمان أنه عندما تتوقف الأم، تتبعها جميع أبنائها. يتضمن ذلك استخدام تقنيات برمجة محددة، مثل «مديري السياق» (context managers)، لتتبع وإنهاء جميع المهام الفرعية بشكل صحيح. فهم هذه التفاصيل الخفية يساعدنا على تقدير الجهود لجعل أنظمتنا الموزعة أكثر كفاءة، وإبعاد تلك «الزومبي الرقمية»!