هل معالج atexit المسجل موروث من خلال العمليات الفرعية؟

StackOverflow https://stackoverflow.com/questions/1052716

  •  20-08-2019
  •  | 
  •  

سؤال

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

لقد لاحظت أن هذا السلوك غير مذكور في بيثون atexit الوثيقة، أي شخص يعرف هذه القضية؟إذا كانت هذه هي الطريقة التي ينبغي أن يتصرف بها، فكيف يمكنني إلغاء تسجيل معالج الخروج في العمليات الفرعية؟يوجد atexit.unregister في الإصدار 3.0، لكني أستخدم 2.5.

هل كانت مفيدة؟

المحلول

لا توجد واجهة برمجة تطبيقات (API) للقيام بذلك في Python 2.5، ولكن يمكنك فقط:

import atexit
atexit._exithandlers = []

في عمليات طفلك - إذا كنت تعلم أن لديك معالج خروج واحدًا فقط مثبتًا، وأنه لم يتم تثبيت أي معالجات أخرى.ومع ذلك، انتبه إلى أن بعض أجزاء ملف stdlib (على سبيل المثال. logging) يسجل atexit معالجات.لتجنب الدوس عليهم، يمكنك تجربة ما يلي:

my_handler_entries = [e for e in atexit._exithandlers if e[0] == my_handler_func]
for e in my_handler_entries:
    atexit._exithandlers.remove(e)

أين my_handler_func هل atexit المعالج الذي قمت بتسجيله، وهذا من شأنه أن يزيل إدخالك دون إزالة الآخرين.

نصائح أخرى

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

atexit.register() يسجل وظيفتك بشكل أساسي في atexit._exithandlers, ، وهي عبارة عن قائمة وحدة خاصة بالوظائف التي يتم استدعاؤها بواسطة sys.exitfunc().يمكنك ضبط exitfunc() إلى وظيفة معالج الخروج المخصصة لديك، والتي تتحقق بعد ذلك من حالة الطفل أو تقوم ببساطة بإلغاء تسجيلها.ماذا عن مجرد نسخ 3.0 atexit.py إلى شجرة المصدر المحلية الخاصة بك واستخدام ذلك بدلا من ذلك؟

يحرر:لقد قمت بنسخ atexit.py من الإصدار 2.6 الخاص بي وقمت بتمديده

def unregister(func, *targs, **kargs):
    _exithandlers.remove((func, targs, kargs))

إذا أخذت ذلك بدلاً من نسختك الأصلية، فيجب أن يعمل.لم أختبره مع العمليات الفرعية، رغم ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top