New submission from Diogo Flores <[email protected]>:
Hello,
I came across with what seems like a bug (or at least a disagreement with the
current documentation).
Discussion:
I expected that after creating a numpy-array (on terminal 1), which is backed
by shared memory, I would be able to use it in other terminals until I would
call `shm.unlink()` (on terminal 1), at which point, the memory block would be
released and no longer accessible.
What happened is that after accessing the numpy-array from terminal 2, I called
'close()' on the local 'existing_shm' instance and exited the interpreter,
which displayed the `warning` seen below.
After, I tried to access the same shared memory block from terminal 3, and a
FileNotFoundError was raised. (The same error was also raised when I tried to
call 'shm.unlink()' on terminal 1, after calling 'close()' on terminal 2.)
It seems that calling `close()` on an instance, destroys further access to the
shared memory block from any point, while what I expected was to be able to
access the array (i.e. on terminal 2), modify it, "close" my access to it, and
after be able to access the modified array on i.e. terminal 3.
If the error is on my side I apologize for raising this issue and I would
appreciate for clarification on what I am doing wrong.
Thank you.
Diogo
Please check below for the commands issued:
## Terminal 1
>>> from multiprocessing import shared_memory
>>> import numpy as np
>>>
>>> a = np.array([x for x in range(10)])
>>> shm = shared_memory.SharedMemory(create=True, size=a.nbytes)
>>> b = np.ndarray(a.shape, dtype=a.dtype, buffer=shm.buf)
>>> b[:] = a[:]
>>>
>>> shm.name
'psm_592ec635'
## Terminal 2
>>> from multiprocessing import shared_memory
>>> import numpy as np
>>>
>>> existing_shm = shared_memory.SharedMemory('psm_592ec635')
>>> c = np.ndarray((10,), dtype=np.int64, buffer=existing_shm.buf)
>>>
>>> c
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>
>>> del c
>>> existing_shm.close()
>>>
>>> exit()
~: /usr/lib/python3.8/multiprocessing/resource_tracker.py:203: UserWarning:
resource_tracker: There appear to be 1 leaked shared_memory objects to clean up
at shutdown
warnings.warn('resource_tracker: There appear to be %d '
## Finally, on terminal 3
>>> from multiprocessing import shared_memory
>>> import numpy as np
>>>
>>> existing_shm = shared_memory.SharedMemory('psm_592ec635')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.8/multiprocessing/shared_memory.py", line 100, in
__init__
self._fd = _posixshmem.shm_open(
FileNotFoundError: [Errno 2] No such file or directory: '/psm_592ec635'
----------
components: Library (Lib)
messages: 364121
nosy: dxflores
priority: normal
severity: normal
status: open
title: (Possible) bug on multiprocessing.shared_memory
versions: Python 3.8
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue39959>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com