Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 5a89248

Browse filesBrowse files
[3.11] gh-106939: document ShareableList nul-strip quirk. (GH-107266) (#107270)
gh-106939: document ShareableList nul-strip quirk. (GH-107266) * gh-106939: document ShareableList nul-strip quirk. * Mention the `int` size constraint. (cherry picked from commit 70dc009) Co-authored-by: Gregory P. Smith <greg@krypto.org>
1 parent 2ce8e13 commit 5a89248
Copy full SHA for 5a89248

File tree

Expand file treeCollapse file tree

1 file changed

+37
-7
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+37
-7
lines changed

‎Doc/library/multiprocessing.shared_memory.rst

Copy file name to clipboardExpand all lines: Doc/library/multiprocessing.shared_memory.rst
+37-7Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -255,16 +255,17 @@ shared memory blocks created using that manager are all released when the
255255
:keyword:`with` statement's code block finishes execution.
256256

257257

258-
.. class:: ShareableList(sequence=None, *, name=None)
258+
.. class:: ShareableList(sequence=None, \*, name=None)
259259

260260
Provides a mutable list-like object where all values stored within are
261261
stored in a shared memory block. This constrains storable values to
262-
only the ``int``, ``float``, ``bool``, ``str`` (less than 10M bytes each),
263-
``bytes`` (less than 10M bytes each), and ``None`` built-in data types.
264-
It also notably differs from the built-in ``list`` type in that these
265-
lists can not change their overall length (i.e. no append, insert, etc.)
266-
and do not support the dynamic creation of new :class:`ShareableList`
267-
instances via slicing.
262+
only the ``int`` (signed 64-bit), ``float``, ``bool``, ``str`` (less
263+
than 10M bytes each when encoded as utf-8), ``bytes`` (less than 10M
264+
bytes each), and ``None`` built-in data types. It also notably
265+
differs from the built-in ``list`` type in that these lists can not
266+
change their overall length (i.e. no append, insert, etc.) and do not
267+
support the dynamic creation of new :class:`ShareableList` instances
268+
via slicing.
268269

269270
*sequence* is used in populating a new ``ShareableList`` full of values.
270271
Set to ``None`` to instead attach to an already existing
@@ -275,6 +276,35 @@ shared memory blocks created using that manager are all released when the
275276
existing ``ShareableList``, specify its shared memory block's unique
276277
name while leaving ``sequence`` set to ``None``.
277278

279+
.. note::
280+
281+
A known issue exists for :class:`bytes` and :class:`str` values.
282+
If they end with ``\x00`` nul bytes or characters, those may be
283+
*silently stripped* when fetching them by index from the
284+
:class:`ShareableList`. This ``.rstrip(b'\x00')`` behavior is
285+
considered a bug and may go away in the future. See :gh:`106939`.
286+
287+
For applications where rstripping of trailing nulls is a problem,
288+
work around it by always unconditionally appending an extra non-0
289+
byte to the end of such values when storing and unconditionally
290+
removing it when fetching:
291+
292+
.. doctest::
293+
294+
>>> from multiprocessing import shared_memory
295+
>>> nul_bug_demo = shared_memory.ShareableList(['?\x00', b'\x03\x02\x01\x00\x00\x00'])
296+
>>> nul_bug_demo[0]
297+
'?'
298+
>>> nul_bug_demo[1]
299+
b'\x03\x02\x01'
300+
>>> nul_bug_demo.shm.unlink()
301+
>>> padded = shared_memory.ShareableList(['?\x00\x07', b'\x03\x02\x01\x00\x00\x00\x07'])
302+
>>> padded[0][:-1]
303+
'?\x00'
304+
>>> padded[1][:-1]
305+
b'\x03\x02\x01\x00\x00\x00'
306+
>>> padded.shm.unlink()
307+
278308
.. method:: count(value)
279309

280310
Returns the number of occurrences of ``value``.

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.