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

كيفية مقاطعة تنفيذ وظيفة بايثون مع انتهاء المهلة؟

تم النشر بتاريخ 2025-01-16
تصفح:469

How to Interrupt a Python Function Execution with a Timeout?

مقاطعة وظيفة مع انتهاء المهلة في بايثون

عند استدعاء الوظائف التي قد تتوقف إلى أجل غير مسمى، مما يمنع البرنامج النصي من التنفيذ بشكل أكبر، يصبح من الضروري تنفيذ آلية المهلة. توفر حزمة signal في Python حلاً لهذه المشكلة.

حزمة signal، المستخدمة بشكل أساسي في أنظمة UNIX، تسمح لك بإعداد مهلة لوظيفة معينة. إذا تجاوزت الدالة المهلة المحددة، يتم رفع إشارة لمقاطعة التنفيذ.

مثال:

ضع في اعتبارك دالة Loop_forever () التي قد تعمل إلى أجل غير مسمى. نحن بحاجة إلى استدعاء هذه الوظيفة ولكن تعيين مهلة قدرها 5 ثوان. إذا كانت الوظيفة تستغرق أكثر من 5 ثوان، نريد إلغاء تنفيذها.

إشارة الاستيراد # سجل معالجًا للمهلة معالج Def (الإشارة والإطار): طباعة ("المهلة! إلغاء تنفيذ الوظيفة.") رفع الاستثناء ("تم تجاوز المهلة!") # سجل معالج وظيفة الإشارة إشارة.إشارة (إشارة.SIGALRM، معالج) # تحديد مهلة 5 ثواني إشارة إنذار(5) يحاول: حلقة_للأبد () باستثناء الاستثناء كـ e: طباعة (شارع (ه)) # قم بإلغاء المؤقت إذا انتهت الوظيفة قبل انتهاء المهلة signal.alarm(0)
import signal

# Register a handler for the timeout
def handler(signum, frame):
    print("Timeout! Cancelling function execution.")
    raise Exception("Timeout exceeded!")

# Register the signal function handler
signal.signal(signal.SIGALRM, handler)

# Define a timeout of 5 seconds
signal.alarm(5)

try:
    loop_forever()
except Exception as e:
    print(str(e))
    
# Cancel the timer if the function finishes before timeout
signal.alarm(0)
في هذا المثال، بعد 5 ثوانٍ، يتم استدعاء وظيفة المعالج، مما يؤدي إلى ظهور استثناء. تم اكتشاف هذا الاستثناء في الكود الأصلي، والذي يقوم بعد ذلك بإلغاء المؤقت وإنهاء تنفيذ وظيفة ()loop_forever.

أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3