GIL state during import
davea at ieee.org
Wed Feb 17 10:59:38 CET 2010
Terry Reedy wrote:
> <div class="moz-text-flowed" style="font-family: -moz-fixed">On
> 2/16/2010 4:37 PM, Doron Tal wrote:
>> Is the GIL released during import statement execution when accessing the
>> If not, is it a bug?
>> If it is not a bug, or it is here to stay for any other reason, I think
>> it should be mentioned in the documentation.
> The CPython GIL is a CPython implementation artifact and should not be
> mentioned in the language docs (and is not, as far as I know). Were
> you thinking of something else? And why this specific feature of its
> behavior, whatever it is.
Threading vs. imports is mentioned at least once in the Python docs.
See http://docs.python.org/library/threading.html, section 17.2.9 (at
least in version 2.6.4)
"""While the import machinery is thread safe, there are two key
restrictions on threaded imports due to inherent limitations in the way
that thread safety is provided:
* Firstly, other than in the main module, an import should not have
the side effect of spawning a new thread and then waiting for that
thread in any way. Failing to abide by this restriction can lead
to a deadlock if the spawned thread directly or indirectly
attempts to import a module.
* Secondly, all import attempts must be completed before the
interpreter starts shutting itself down. This can be most easily
achieved by only performing imports from non-daemon threads
created through the threading module. Daemon threads and threads
created directly with the thread module will require some other
form of synchronization to ensure they do not attempt imports
after system shutdown has commenced. Failure to abide by this
restriction will lead to intermittent exceptions and crashes
during interpreter shutdown (as the late imports attempt to access
machinery which is no longer in a valid state).
So it may or may not use the GIL, but there are thread restrictions
during an import. The rule I try to follow is not to do anything
non-trivial during top-level code of a module, except inside the
if __name__ == "__main__":
portion. If we're inside that portion, we're not a module, we're a script.
Even better, import all your modules before starting any new threads.
More information about the Python-list