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

كيف يمكنني إلغاء وظائف بايثون طويلة الأمد باستخدام المهلات؟

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

How Can I Cancel Long-Running Python Functions Using Timeouts?

إلغاء استدعاءات الوظائف طويلة الأمد مع انتهاء المهلات

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

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

ضع في اعتبارك مقتطف التعليمات البرمجية التالي:

import signal

# Register a signal handler for the timeout
def handler(signum, frame):
    print("Forever is over!")
    raise Exception("end of time")

# Define a function that may run for an indetermined time
def loop_forever():
    import time
    while 1:
        print("sec")
        time.sleep(1)

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

# Define a timeout for the function
signal.alarm(10)

try:
    loop_forever()
except Exception as exc:
    print(exc)

# Cancel the timer if the function returned before timeout
signal.alarm(0)

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

بعد تعيين مهلة مدتها 10 ثوانٍ باستخدام signal.alarm(10)، نحاول تنفيذ حلقة للأبد. إذا استغرق تنفيذ الوظيفة وقتًا أطول من 10 ثوانٍ، فسيتم استدعاء معالج الإشارة الخاص بنا، وطباعة عبارة "Forever is over!" ورفع استثناء.

لضمان التعامل السليم مع سيناريو المهلة، من الضروري إلغاء المؤقت إذا عادت الوظيفة قبل الوقت المحدد. في مثالنا، نستدعي signal.alarm(0) لإلغاء المؤقت عند ظهور الاستثناء.

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

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

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

Copyright© 2022 湘ICP备2022001581号-3