mirror of
https://github.com/python/cpython.git
synced 2025-08-01 15:43:13 +00:00
SF bug #1473760 TempFile can hang on Windows.
Python 2.4 changed ntpath.abspath to do an import inside the function. As a result, due to Python's import lock, anything calling abspath on Windows (directly, or indirectly like tempfile.TemporaryFile) hung when it was called from a thread spawned as a side effect of importing a module. This is a depressingly frequent problem, and deserves a more general fix. I'm settling for a micro-fix here because this specific one accounts for a report of Zope Corp's ZEO hanging on Windows, and it was an odd way to change abspath to begin with (ntpath needs a different implementation depending on whether we're actually running on Windows, and the _obvious_ way to arrange for that is not to bury a possibly-failing import _inside_ the function). Note that if/when other micro-fixes of this kind get made, the new Lib/test/threaded_import_hangers.py is a convenient place to add tests for them.
This commit is contained in:
parent
9f7e58afa7
commit
21fbd57d66
4 changed files with 86 additions and 21 deletions
42
Lib/test/threaded_import_hangers.py
Normal file
42
Lib/test/threaded_import_hangers.py
Normal file
|
@ -0,0 +1,42 @@
|
|||
# This is a helper module for test_threaded_import. The test imports this
|
||||
# module, and this module tries to run various Python library functions in
|
||||
# their own thread, as a side effect of being imported. If the spawned
|
||||
# thread doesn't complete in TIMEOUT seconds, an "appeared to hang" message
|
||||
# is appended to the module-global `errors` list. That list remains empty
|
||||
# if (and only if) all functions tested complete.
|
||||
|
||||
TIMEOUT = 10
|
||||
|
||||
import threading
|
||||
|
||||
import tempfile
|
||||
import os.path
|
||||
|
||||
errors = []
|
||||
|
||||
# This class merely runs a function in its own thread T. The thread importing
|
||||
# this module holds the import lock, so if the function called by T tries
|
||||
# to do its own imports it will block waiting for this module's import
|
||||
# to complete.
|
||||
class Worker(threading.Thread):
|
||||
def __init__(self, function, args):
|
||||
threading.Thread.__init__(self)
|
||||
self.function = function
|
||||
self.args = args
|
||||
|
||||
def run(self):
|
||||
self.function(*self.args)
|
||||
|
||||
for name, func, args in [
|
||||
# Bug 147376: TemporaryFile hung on Windows, starting in Python 2.4.
|
||||
("tempfile.TemporaryFile", tempfile.TemporaryFile, ()),
|
||||
|
||||
# The real cause for bug 147376: ntpath.abspath() caused the hang.
|
||||
("os.path.abspath", os.path.abspath, ('.',)),
|
||||
]:
|
||||
|
||||
t = Worker(func, args)
|
||||
t.start()
|
||||
t.join(TIMEOUT)
|
||||
if t.isAlive():
|
||||
errors.append("%s appeared to hang" % name)
|
Loading…
Add table
Add a link
Reference in a new issue