mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	 21fbd57d66
			
		
	
	
		21fbd57d66
		
	
	
	
	
		
			
			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.
		
			
				
	
	
		
			42 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # 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)
 |