Bug #128475: mimetools.encode (sometimes) fails when called from a thread.
pythonrun.c:  In Py_Finalize, don't reset the initialized flag until after
the exit funcs have run.
atexit.py:  in _run_exitfuncs, mutate the list of pending calls in a
threadsafe way.  This wasn't a contributor to bug 128475, it just burned
my eyeballs when looking at that bug.
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index ff2142b..4c94f9b 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -181,9 +181,18 @@
 
 	if (!initialized)
 		return;
-	initialized = 0;
 
+	/* The interpreter is still entirely intact at this point, and the
+	 * exit funcs may be relying on that.  In particular, if some thread
+	 * or exit func is still waiting to do an import, the import machinery
+	 * expects Py_IsInitialized() to return true.  So don't say the
+	 * interpreter is uninitialized until after the exit funcs have run.
+	 * Note that Threading.py uses an exit func to do a join on all the
+	 * threads created thru it, so this also protects pending imports in
+	 * the threads created via Threading.
+	 */
 	call_sys_exitfunc();
+	initialized = 0;
 
 	/* Get current thread state and interpreter pointer */
 	tstate = PyThreadState_Get();