Stefan Behnel <stefan...@behnel.de> added the comment:

I support that there should be a simple way to do this from C. The way via 
importing the "gc" module and then looking up an attribute (possibly building a 
Unicode string) and calling a function in it involves several operations that 
can take some time and require useless error handling since each of them will 
practically never fail but may. An operation as simple as changing the GC 
status shouldn't require that.

A use case is building large data structures, or critical rearrangements of 
data structures that involve object operations that might trigger a GC run, 
maybe even including temporarily invalid object states and graphs. When larger 
data structures are involved but no collectable cycles, then the GC will 
probably not do anything useful except slowing down the creation process and/or 
running arbitrary code in between.

I consider the need to disable garbage collection in critical sections of C 
code similar to locking and GIL handling. It isn't quite the same as locking, 
since other code can enable it again when it runs, which isn't the case for a 
lock, but especially in that case, being able to detect quickly whether it was 
re-enabled when my own code gains back control seems beneficial. Having to call 
a Python function for that and taking care of the object result is way too much 
overhead for this case.

The fact that this is a rare request may not necessarily mean that it's rarely 
needed. There is certainly a bunch of C code out there that would benefit from 
temporarily disabling the GC in critical sections. I would imagine that people 
simply don't think of doing it and fail to notice any resulting slow-downs or 
even crashes since those often require elaborate circumstances to occur, and 
thus may not become visible at all in test or benchmark scenarios.

Note that the GC state is now part of the PyInterpreterState, so a patch would 
need to do what "gc_enable_impl" and "gc_disable_impl" do in 
Modules/gcmodule.c, or, rather, become their implementation to share code.

----------
components: +C API -Extension Modules
nosy: +scoder
resolution: rejected -> 
stage:  -> needs patch
status: closed -> open
type:  -> resource usage
versions: +Python 3.10 -Python 3.7

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue28254>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to