So far, I've been advised to:

1/ Double-check that the GIL was correctly acquired
2/ Ensure there's no 'string' module in my project
3/ Manually pre-import commonly used standard modules at interpreter's 
init-time to avoid race conditions due to the multi-threaded nature of the 
running environment

No problem found for 1/ & 2/ (double-checked). I tried 3/ before posting and 
could not reproduce the problem at all which is probably the patch I will apply 
due to the lack of a better solution. I guess I'll have to dig into 
__import__'s code and related.


On Thursday, February 4, 2016 at 11:20:05 AM UTC+1, Jean-Charles Lefebvre wrote:
> Hi all,
> 
> The short version: How CPython marks a module as being fully imported, if it 
> does, so that the same import statement ran from another C thread at the same 
> time does not collide? Or, reversely, does not think the module is not 
> already fully imported?
> 
> The full version: I'm running CPython 3.5.1, embedded into a C++ application 
> on Windows. The application is heavily multi-threaded so several C threads 
> call some Python code at the same time (different Python modules), sharing 
> interpreter's resources by acquiring/releasing the GIL frequently DURING the 
> calls, at language boundaries.
> 
> Sometimes (but always only once per application instance), a call to 
> os.path.expandvars raises the AttributeError exception with message: module 
> 'string' has no attribute 'ascii_letters'. It is raised by the 
> ntpath.expandvars function (line 372). When I noticed the late import 
> statement of the 'string' module at the line above, I thought that MAYBE, it 
> could be because the interpreter is ran in an heavily multi-threaded 
> environment and that the GIL acquiring/releasing occurred at a bad timing? 
> Making me wonder how the import mechanism interacts with the GIL, if it does?
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to