"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية التعامل مع مقاطعة لوحة المفاتيح في مجمع المعالجة المتعددة في بايثون؟

كيفية التعامل مع مقاطعة لوحة المفاتيح في مجمع المعالجة المتعددة في بايثون؟

تم النشر بتاريخ 2024-12-22
تصفح:582

How to Handle Keyboard Interrupts in Python\'s Multiprocessing Pool?

التعامل مع مقاطعات لوحة المفاتيح في تجمع المعالجة المتعددة في بايثون

في وحدة المعالجة المتعددة في بايثون، توفر فئة المجمع طريقة ملائمة لتوزيع المهام عبر عمليات متعددة. ومع ذلك، قد يكون التعامل مع أحداث KeyboardInterrupt في Pools أمرًا صعبًا، كما هو موضح في مقتطف التعليمات البرمجية:

from multiprocessing import Pool
from time import sleep
from sys import exit

def slowly_square(i):
    sleep(1)
    return i*i

def go():
    pool = Pool(8)
    try:
        results = pool.map(slowly_square, range(40))
    except KeyboardInterrupt:
        # **** THIS PART NEVER EXECUTES. ****
        pool.terminate()
        print "You cancelled the program!"
        sys.exit(1)
    print "\nFinally, here are the results: ", results

if __name__ == "__main__":
    go()

عند تشغيل هذا الكود، فإن الضغط على Ctrl C لن يؤدي إلى تشغيل عملية التنظيف، مما يترك العمليات الفرعية تعمل إلى أجل غير مسمى. لمعالجة هذه المشكلة، فكر في الحل البديل التالي:

السلوك الذي تمت ملاحظته في التعليمات البرمجية هو نتيجة لخطأ في Python. لا يتم إرسال KeyboardInterrupt عند انتظار شرط في Threading.Condition.wait(). نظرًا لأن Pool.map() يستخدم شرط الانتظار داخليًا، فلن يتم تلقي المقاطعة مطلقًا.

الحل هو استخدام Pool.map_async()، والذي يسمح بتحديد المهلة. من خلال تعيين مهلة طويلة بما فيه الكفاية (على سبيل المثال، 9999999)، يمكننا التأكد من تشغيل المقاطعة خلال فترة زمنية معقولة.

لذلك، استبدل:

    results = pool.map(slowly_square, range(40))

مع:

    results = pool.map_async(slowly_square, range(40)).get(9999999)

يوفر هذا الحل البديل طريقة للتعامل بأمان مع أحداث KeyboardInterrupt في تجمعات المعالجة المتعددة، مما يسمح بإنهاء كافة العمليات الفرعية عندما يقوم المستخدم بإلغاء البرنامج.

بيان الافراج أعيد طبع هذه المقالة على: 1729576640 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3