Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is registered atexit handler inherited by spawned child processes?

I am writing a daemon program using python 2.5. In the main process an exit handler is registered with atexit module, it seems that the handler gets called when each child process ends, which is not I expected.

I noticed this behavior isn't mentioned in python atexit doc, anybody knows the issue? If this is how it should behave, how can I unregister the exit handler in children processes? There is a atexit.unregister in version 3.0, but I am using 2.5.

like image 465
btw0 Avatar asked Feb 28 '23 14:02

btw0


2 Answers

When you fork to make a child process, that child is an exact copy of the parent -- including of course registered exit functions as well as all other code and data structures. I believe that's the issue you're observing -- of course it's not mentioned in each and every module, because it necessarily applies to every single one.

like image 180
Alex Martelli Avatar answered Mar 08 '23 23:03

Alex Martelli


There isn't an API to do it in Python 2.5, but you can just:

import atexit
atexit._exithandlers = []

in your child processes - if you know you only have one exit handler installed, and that no other handlers are installed. However, be aware that some parts of the stdlib (e.g. logging) register atexit handlers. To avoid trampling on them, you could try:

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)

where my_handler_func is the atexit handler you registered, and this should remove your entry without removing the others.

like image 43
Vinay Sajip Avatar answered Mar 09 '23 00:03

Vinay Sajip