-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Running the tests in multiple threads fails because of thread-unsafe Python code #8492
Comments
My thoughts.
I wouldn't expect users to be changing them in multiple threads. I would imagine that for almost all scenarios, users would register their plugins and associated metadata, and then move on. We have
I think that modifying plugins is not supported across multiple threads. If multiple threads run Image.register_open(TiffImageFile.format, TiffImageFile, _accept) at once, that shouldn't pose a problem. I can imagine that a user might want to load a truncated image and return to normal operations afterwards from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
im = Image.open(...)
im.load()
ImageFile.LOAD_TRUNCATED_IMAGES = False and that might lead to unexpected results in a multithreaded environment. Perhaps we need to re-explore passing additional parameters to Similarly to plugins, I don't expect users to be registering multiple I don't expect there is a universal method to ask pytest to run a single test in a single-threaded way - you're running pytest-run-parallel, #8454 is running pytest-freethreaded - so perhaps the simplest solution to the Tests/test_file_bufrstub.py problem is to just return early if the test is already in progress on another thread. I've created #8501 as a suggestion. |
This is a good idea, I'll explore this. Making these |
Apart from the failure in #8454 and other hard crashes at the C level (I'll open separate issues for those), quite a few tests fail when run in multiple threads because of thread-unsafe Python code.
The failures come mainly from three different thread safety issues. Two of those issues come from issues in the tests themselves:
pytest.warns
which is inherently thread-unsafe. The solution for this is to always run those tests in a single thread.uuid.uuid4()
and prepending that to the filenameImage.save
is called with).The third, however, is because of thread-unsafe Python code in Pillow. More specifically, various registries (like these ones) are kept as global variables. Changing these in multiple threads leads to data races. Fixing these is going to be harder, but the possible solutions are:
ContextVar
s orthreading.local
s. This is a backwards-incompatible change though and users that touch these in their code will have to update it to use the context variable APIs (.get()
&.set()
).Does anyone else have ideas regarding other ways to handle this?
An easy way to reproduce this (though this fails because of this global variable) is to install
pytest-run-parallel
and then run the following under the free-threaded build:Failure info
I've verified that the following patch fixes the issue.
The text was updated successfully, but these errors were encountered: