[Python-Dev] atexit missing an unregister method

2005-04-26 Thread Nick Jacobson
I was looking at the atexit module the other day; it seems like an elegant 
way to ensure that resources are cleaned up (that the garbage collector 
doesn't take care of).

But while you can mark functions to be called with the 'register' method, 
there's no 'unregister' method to remove them from the stack of functions to 
be called.  Nor is there any way to view this stack and e.g. call 'del' on a 
registered function.

This would be useful in the following scenario, in which x and y are 
resources that need to be cleaned up, even in the event of a program exit:

import atexit
def free_resource(resource):
   ...
atexit.register(free_resource, x)
atexit.register(free_resource, y)
# do operations with x and y, potentially causing the program to exit
...
# if nothing caused the program to unexpectedly quit, close the resources
free_resource(x)
free_resource(y)
#unregister the functions, so that you don't try to free the resources 
twice!
atexit.unregisterall()

Alternatively, it would be great if there were a way to view the stack of 
registered functions, and delete them from there.

--Nick Jacobson
_
Don’t just search. Find. Check out the new MSN Search! 
http://search.msn.click-url.com/go/onm00200636ave/direct/01/

___
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com


Re: [Python-Dev] atexit missing an unregister method

2005-04-26 Thread Guido van Rossum
On 4/26/05, Nick Jacobson [EMAIL PROTECTED] wrote:
 I was looking at the atexit module the other day; it seems like an elegant
 way to ensure that resources are cleaned up (that the garbage collector
 doesn't take care of).
 
 But while you can mark functions to be called with the 'register' method,
 there's no 'unregister' method to remove them from the stack of functions to
 be called.  Nor is there any way to view this stack and e.g. call 'del' on a
 registered function.
 
 This would be useful in the following scenario, in which x and y are
 resources that need to be cleaned up, even in the event of a program exit:
 
 import atexit
 
 def free_resource(resource):
 ...
 
 atexit.register(free_resource, x)
 atexit.register(free_resource, y)
 # do operations with x and y, potentially causing the program to exit
 ...
 # if nothing caused the program to unexpectedly quit, close the resources
 free_resource(x)
 free_resource(y)
 #unregister the functions, so that you don't try to free the resources
 twice!
 atexit.unregisterall()
 
 Alternatively, it would be great if there were a way to view the stack of
 registered functions, and delete them from there.

Methinks that the resource cleanup routines ought to be written so as
to be reentrant. That shouldn't be too hard (you can always maintain a
global flag that means already called).

-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)
___
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com


RE: [Python-Dev] atexit missing an unregister method

2005-04-26 Thread Raymond Hettinger
[Nick Jacobson]
 I was looking at the atexit module the other day; it seems like an
elegant
 way to ensure that resources are cleaned up (that the garbage
collector
 doesn't take care of).
 
 But while you can mark functions to be called with the 'register'
method,
 there's no 'unregister' method to remove them from the stack of
functions
 to
 be called.  
 . . .
 Alternatively, it would be great if there were a way to view the stack
of
 registered functions, and delete them from there.



Please file a feature request on SourceForge.

Will mull it over for a while.  My first impression is that try/finally
is a better tool for the scenario you outlined.  

The issue with unregister() is that the order of clean-up calls is
potentially significant.  If the same function is listed more than once,
there would be no clear-cut way to know which should be removed when
unregister() is called.

Likewise, I suspect that exposing the stack will create more pitfalls
and risks than it could provide in benefits.  Dealing with a stack of
functions is likely to be clumsy at best.


Raymond Hettinger
___
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com


Re: [Python-Dev] atexit missing an unregister method

2005-04-26 Thread Greg Ewing
Nick Jacobson wrote:
But while you can mark functions to be called with the 'register' 
method, there's no 'unregister' method to remove them from the stack of 
functions to be called.
You can always build your own mechanism for managing
cleanup functions however you want, and register a
single atexit() hander to invoke it. I don't think
there's any need to mess with the way atexit()
currently works.
--
Greg Ewing, Computer Science Dept, +--+
University of Canterbury,  | A citizen of NewZealandCorp, a   |
Christchurch, New Zealand  | wholly-owned subsidiary of USA Inc.  |
[EMAIL PROTECTED]  +--+
___
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com