Skip to content

nibabel thread safe? #1454

@Remi-Gau

Description

@Remi-Gau

I have started testing nilearn on several threads so I am having a look at its upstream libraries to see their thread safe status.

Tried quickly running the tests in multi-threaded (see https://github.com/Quansight-Labs/pytest-run-parallel?tab=readme-ov-file and https://py-free-threading.github.io/) but I am encountering a few parallel failures:

To reproduce:

uv venv -p '3.14t' 
source .venv/bin/activate 
pip install -e '.[test]'  
uv pip install pytest-run-parallel    
PYTEST_RUN_PARALLEL_VERBOSE=1  
N_THREADS=16     
pytest  --parallel-threads $N_THREADS nibabel/tests/test_nifti* # only testing a couple of modules

Am getting:

1136 passed, 4 skipped, 4 xfailed, 49 errors

with

PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1PairHeader::test_log_checks - AssertionError: assert 'sizeof_hdr s..._hdr to 348\n' == ''
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1PairHeader::test_pixdim_log_checks - AssertionError: assert 'pixdim[1,2,3...xdim values\n' == ''
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1PairHeader::test_logger_error - AssertionError: assert 'bitpix does ...ch datatype\n' == 'bitpix does ...ch datatype\n'
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1PairHeader::test_nifti_qfac_checks - AssertionError: assert '' != ''
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1PairHeader::test_nifti_qsform_checks - AssertionError: assert '' != ''
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1PairHeader::test_magic_offset_checks - AssertionError: assert 'magic string... are likely\n' == ''
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1SingleHeader::test_log_checks - AssertionError: assert '' != ''
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1SingleHeader::test_pixdim_log_checks - AssertionError: assert 'pixdim[1,2,3...xdim values\n' == ''
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1SingleHeader::test_logger_error - AssertionError: assert 'bitpix does ...ch datatype\n' == 'bitpix does ...ch datatype\n'
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1SingleHeader::test_nifti_qfac_checks - AssertionError: assert '' != ''
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1SingleHeader::test_nifti_qsform_checks - AssertionError: assert 'qform_code -... setting to 0' == 'qform_code -... setting to 0'
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1SingleHeader::test_magic_offset_checks - AssertionError: assert '' != ''
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1Pair::test_load_mmap - FileNotFoundError: [Errno 2] No such file or directory: 'test.hdr'
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1Pair::test_big_offset_exts - nibabel.wrapstruct.WrapStructError: Binary block is wrong size
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1Pair::test_dtype_to_filename_arg - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1Pair::test_hdr_diff - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1Pair::test_load_save - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1Image::test_load_mmap - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1Image::test_big_offset_exts - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1Image::test_dtype_to_filename_arg - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1Image::test_hdr_diff - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1Image::test_load_save - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti1.py::test_extension_io - assert 0 == 1
PARALLEL FAILED nibabel/tests/test_nifti1.py::TestNifti1General::test_load - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2PairHeader::test_log_checks - AssertionError: assert '' != ''
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2PairHeader::test_pixdim_log_checks - AssertionError: assert 'pixdim[1,2,3...xdim values\n' == ''
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2PairHeader::test_logger_error - AssertionError: assert 'bitpix does ...ch datatype\n' == 'bitpix does ...ch datatype\n'
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2PairHeader::test_nifti_qfac_checks - AssertionError: assert '' != ''
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2PairHeader::test_nifti_qsform_checks - AssertionError: assert '' != ''
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2PairHeader::test_magic_offset_checks - AssertionError: assert 'magic string... are likely\n' == ''
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2PairHeader::test_eol_check - AssertionError: assert 'EOL check al... 10, 26, 10\n' == ''
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2SingleHeader::test_log_checks - AssertionError: assert '' != ''
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2SingleHeader::test_pixdim_log_checks - AssertionError: assert 'pixdim[1,2,3...xdim values\n' == ''
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2SingleHeader::test_logger_error - AssertionError: assert 'bitpix does ...ch datatype\n' == 'bitpix does ...ch datatype\n'
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2SingleHeader::test_nifti_qfac_checks - AssertionError: assert 'pixdim[0] (q...g qfac to 1\n' == ''
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2SingleHeader::test_nifti_qsform_checks - AssertionError: assert 'qform_code -...etting to 0\n' == ''
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2SingleHeader::test_magic_offset_checks - AssertionError: assert '' != ''
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2SingleHeader::test_eol_check - AssertionError: assert 'EOL check al... 10, 26, 10\n' == ''
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2Image::test_load_mmap - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2Image::test_big_offset_exts - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2Image::test_dtype_to_filename_arg - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2Image::test_hdr_diff - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2Image::test_load_save - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2Pair::test_load_mmap - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2Pair::test_big_offset_exts - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2Pair::test_dtype_to_filename_arg - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2Pair::test_hdr_diff - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2Pair::test_load_save - FileNotFoundError: [Errno 2] No such file or directory
PARALLEL FAILED nibabel/tests/test_nifti2.py::TestNifti2General::test_load - FileNotFoundError: [Errno 2] No such file or directory

Not started looking into it but from my little experience it could be that the tests and / or the code are not thread safe.

So my question is in short: are there any plans to make nibabel thread safe?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions