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