[Python-Dev] Solving the import-deadlock case
Pascal Chambon
pythoniks at gmail.com
Tue Jul 2 20:31:48 CEST 2013
Hello everyone,
I'd like to bring your attention to this issue, since it touches the
fundamentals of python's import workflow:
http://bugs.python.org/issue17716
/I've tried to post it on the python-import ML for weeks, but it must
still be blocked somewhere in a moderation queue, so here I come ^^/
TLDR version: because of the way import current works, if importing a
package "temporarily" fails whereas importing one of its children
succeeded, we reach an unusable state, all subsequent attempts at
importing that package will fail if a "from...import" is used somewhere.
Typically, it makes a web worker broken, even though the typical
behaviour of such process woudl be to retry loading, again and again,
the failing view.
I agree that a module loading should be, as much as possible, "side
effects free", and thus shouldn't have temporary errors. But well, in
practice, module loading is typically the time where process-wide
initialization are done (modifying sys.path, os.environ, instantiating
connection or thread pools, registering atexit handler, starting
maintenance threads...), so that case has chances to happen at a moment
or another, especially if accesses to filesystem or network (SQL...) are
done at module loading, due to the lack of initialization system at
upper levels.
That's why I propose modifying the behaviour of module import, so that
submodules are deleted as well when a parent module import fails. True,
it means they will be reloaded as well when importing the parent will
start again, but anyway we already have a "double execution" problem
with the reloading of the parent module, so it shouldn't make a big
difference.
The only other solution I'd see would be to SYSTEMATICALLY perform name
(re)binding when processing a from...import statement, to recover from
the previously failed initialization. Dunno if it's a good idea.
On a (separate but related) topic, to be safer on module reimports or
reloadings, it could be interesting to add some "idempotency" to common
initialization tasks ; for example the "atexit" registration system,
wouldn't it be worth adding a boolean flag to explicitely skip
registration if a callable with same fully qualified name is already
registered.
Do you have opinions on these subjects ?
thanks,
regards,
Pascal
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20130702/1ecdb18e/attachment.html>
More information about the Python-Dev
mailing list