@@ -35,41 +35,33 @@ or other communications requiring the serialization/deserialization and
35
35
copying of data.
36
36
37
37
38
- .. class :: SharedMemory(name, flags =None, mode=0o600 , size=0, read_only=False )
38
+ .. class :: SharedMemory(name=None, create=False , size=0)
39
39
40
- This class creates and returns an instance of either a
41
- :class: `PosixSharedMemory ` or :class: `NamedSharedMemory ` class depending
42
- upon their availability on the local system.
40
+ Creates a new shared memory block or attaches to an existing shared
41
+ memory block. Each shared memory block is assigned a unique name.
42
+ In this way, one process can create a shared memory block with a
43
+ particular name and a different process can attach to that same shared
44
+ memory block using that same name.
45
+
46
+ As a resource for sharing data across processes, shared memory blocks
47
+ may outlive the original process that created them. When one process
48
+ no longer needs access to a shared memory block that might still be
49
+ needed by other processes, the :meth: `close() ` method should be called.
50
+ When a shared memory block is no longer needed by any process, the
51
+ :meth: `unlink() ` method should be called to ensure proper cleanup.
43
52
44
53
*name * is the unique name for the requested shared memory, specified as
45
- a string. If ``None `` is supplied for the name, a new shared memory
46
- block with a novel name will be created without needing to also specify
47
- ``flags ``.
48
-
49
- *flags * is set to ``None `` when attempting to attach to an existing shared
50
- memory block by its unique name but if no existing block has that name, an
51
- exception will be raised. To request the creation of a new shared
52
- memory block, set to ``O_CREX ``. To request the optional creation of a
53
- new shared memory block or attach to an existing one by the same name,
54
- set to ``O_CREAT ``.
55
-
56
- *mode * controls user/group/all-based read/write permissions on the
57
- shared memory block. Its specification is not enforceable on all platforms.
58
-
59
- *size * specifies the number of bytes requested for a shared memory block.
60
- Because some platforms choose to allocate chunks of memory based upon
61
- that platform's memory page size, the exact size of the shared memory
62
- block may be larger or equal to the size requested. When attaching to an
63
- existing shared memory block, set to ``0 `` (which is the default).
64
- Requesting a size greater than the original when attaching to an existing
65
- shared memory block will attempt a resize of the shared memory block
66
- which may or may not be successful. Requesting a size smaller than the
67
- original will attempt to attach to the first N bytes of the existing
68
- shared memory block but may still give access to the full allocated size.
69
-
70
- *read_only * controls whether a shared memory block is to be available
71
- for only reading or for both reading and writing. Its specification is
72
- not enforceable on all platforms.
54
+ a string. When creating a new shared memory block, if ``None `` (the
55
+ default) is supplied for the name, a novel name will be generated.
56
+
57
+ *create * controls whether a new shared memory block is created (``True ``)
58
+ or an existing shared memory block is attached (``False ``).
59
+
60
+ *size * specifies the requested number of bytes when creating a new shared
61
+ memory block. Because some platforms choose to allocate chunks of memory
62
+ based upon that platform's memory page size, the exact size of the shared
63
+ memory block may be larger or equal to the size requested. When attaching
64
+ to an existing shared memory block, the ``size `` parameter is ignored.
73
65
74
66
.. method :: close()
75
67
@@ -100,10 +92,6 @@ copying of data.
100
92
101
93
Read-only access to the unique name of the shared memory block.
102
94
103
- .. attribute :: mode
104
-
105
- Read-only access to access permissions mode of the shared memory block.
106
-
107
95
.. attribute :: size
108
96
109
97
Read-only access to size in bytes of the shared memory block.
@@ -113,7 +101,7 @@ The following example demonstrates low-level use of :class:`SharedMemory`
113
101
instances::
114
102
115
103
>>> from multiprocessing import shared_memory
116
- >>> shm_a = shared_memory.SharedMemory(None , size=10)
104
+ >>> shm_a = shared_memory.SharedMemory(create=True , size=10)
117
105
>>> type(shm_a.buf)
118
106
<class 'memoryview'>
119
107
>>> buffer = shm_a.buf
@@ -146,7 +134,7 @@ same ``numpy.ndarray`` from two distinct Python shells:
146
134
>>> import numpy as np
147
135
>>> a = np.array([1 , 1 , 2 , 3 , 5 , 8 ]) # Start with an existing NumPy array
148
136
>>> from multiprocessing import shared_memory
149
- >>> shm = shared_memory.SharedMemory(None , size = a.nbytes)
137
+ >>> shm = shared_memory.SharedMemory(create = True , size = a.nbytes)
150
138
>>> # Now create a NumPy array backed by shared memory
151
139
>>> b = np.ndarray(a.shape, dtype = a.dtype, buffer = shm.buf)
152
140
>>> b[:] = a[:] # Copy the original data into shared memory
@@ -163,7 +151,7 @@ same ``numpy.ndarray`` from two distinct Python shells:
163
151
>>> import numpy as np
164
152
>>> from multiprocessing import shared_memory
165
153
>>> # Attach to the existing shared memory block
166
- >>> existing_shm = shared_memory.SharedMemory(' psm_21467_46075' )
154
+ >>> existing_shm = shared_memory.SharedMemory(name = ' psm_21467_46075' )
167
155
>>> # Note that a.shape is (6,) and a.dtype is np.int64 in this example
168
156
>>> c = np.ndarray((6 ,), dtype = np.int64, buffer = existing_shm.buf)
169
157
>>> c
@@ -252,8 +240,8 @@ needed:
252
240
>>> with shared_memory.SharedMemoryManager() as smm:
253
241
... sl = smm.ShareableList(range (2000 ))
254
242
... # Divide the work among two processes, storing partial results in sl
255
- ... p1 = Process(target = do_work, args = (sl.shm.name , 0 , 1000 ))
256
- ... p2 = Process(target = do_work, args = (sl.shm.name , 1000 , 2000 ))
243
+ ... p1 = Process(target = do_work, args = (sl, 0 , 1000 ))
244
+ ... p2 = Process(target = do_work, args = (sl, 1000 , 2000 ))
257
245
... p1.start()
258
246
... p2.start() # A multiprocessing.Pool might be more efficient
259
247
... p1.join()
0 commit comments