[Neuroimaging] Thread-safe ArrayProxy/fileslice?
effigies at bu.edu
Wed Feb 8 09:20:20 EST 2017
Is there any reason not to open a separate image object, per-thread? I'd
think that should keep the state sufficiently separated, though I would be
interested in the relative performance between that and your solution.
On Wed, Feb 8, 2017 at 8:55 AM, paul mccarthy <pauldmccarthy at gmail.com>
> Howdy all,
> Does anybody have experience accessing image data through the ArrayProxy
> class (or functions in the fileslice module) in a multi-threaded
> environment? I am visualising large 4D images which are kept on disk (via
> my indexed_gzip module), and am having trouble when accessing the data
> from multiple threads, as the seek/read pairs from different threads will
> occasionally become intertwined with each other.
> My hacky workaround is to patch the ArrayProxy.__getitem__ method, and
> add a threading.Lock to each instance, as follows:
> import threading
> import nibabel as nib
> import nibabel.arrayproxy as ap
> def ArrayProxy__getitem__(self, slc):
> if not hasattr(self, '_thread_lock'):
> return self.__real_getitem__(slc)
> return ap.ArrayProxy.__real_getitem__(self, slc)
> # Patch ArrayProxy.__getitem__
> ap.ArrayProxy.__real_getitem__ = ap.ArrayProxy.__getitem__
> ap.ArrayProxy.__getitem__ = ArrayProxy__getitem__
> # Then add a lock to instances
> # which need to be thread-safe
> img = nib.load('MNI152_T1_2mm.nii.gz')
> img.dataobj._thread_lock = threading.Lock()
> This is the first thing I came up with, although I will probably end up
> adding the lock to the fileobj, and patching the fileslice.fileslice
> function instead. Unless there are any better ideas?
> Neuroimaging mailing list
> Neuroimaging at python.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Neuroimaging