عند العمل مع تجمع المعالجة المتعددة في Python، فإن التعامل مع أحداث KeyboardInterrupt ليس دائمًا أمرًا سهلاً. في هذه المقالة، سوف نستكشف كيفية التعامل مع مثل هذه المقاطعات والتأكد من خروج العمليات بأمان.
يوضح نموذج التعليمات البرمجية المقدم التحدي. على الرغم من وجود كتلة التقاط لـ KeyboardInterrupt، إلا أنها لا يتم تنفيذها عند الضغط على مفتاح التحكم-C. بدلاً من ذلك، يتوقف البرنامج حتى يتم إنهاؤه خارجيًا.
يكمن جذر هذه المشكلة في خطأ بايثون يتعلق بحظر شرط في Threading.Condition.wait(). في هذا السياق، لا يتم إرسال KeyboardInterrupt مطلقًا. ونتيجة لذلك، فإنه يمنع معالجة المقاطعة داخل المجمع.
أحد الحلول لهذه المشكلة هو تحديد مهلة عند انتظار النتائج. يمكن استخدام الأسلوب Map_async() مع معلمة المهلة بدلاً من الخريطة(). يسمح هذا الأسلوب بالتعرف على مقاطعة لوحة المفاتيح ومعالجتها:
results = pool.map_async(slowly_square, range(40)).get(9999999)
عن طريق تعيين قيمة مهلة كبيرة ، فإننا نخبر المجمع بشكل أساسي بمواصلة انتظار النتائج حتى يقاطعها المستخدم.
من المهم ملاحظة أن هناك بعض القيود على هذا الحل البديل. إذا انتهت المهلة قبل اكتمال جميع المهام، فسيتم تجاهل النتائج غير المكتملة. لذلك، من الضروري اختيار قيمة المهلة المناسبة التي توازن بين الاستجابة وخطر النتائج غير المكتملة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3