Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5458647

Browse files
committed
Issue #28053: Applying refactorings, docs and other cleanup to follow.
1 parent f1024f7 commit 5458647

13 files changed

Lines changed: 77 additions & 40 deletions

Lib/multiprocessing/connection.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020

2121
import _multiprocessing
2222

23-
from . import reduction
2423
from . import util
2524

2625
from . import AuthenticationError, BufferTooShort
27-
from .reduction import ForkingPickler
26+
from .context import reduction
27+
_ForkingPickler = reduction.ForkingPickler
2828

2929
try:
3030
import _winapi
@@ -203,7 +203,7 @@ def send(self, obj):
203203
"""Send a (picklable) object"""
204204
self._check_closed()
205205
self._check_writable()
206-
self._send_bytes(ForkingPickler.dumps(obj))
206+
self._send_bytes(_ForkingPickler.dumps(obj))
207207

208208
def recv_bytes(self, maxlength=None):
209209
"""
@@ -248,7 +248,7 @@ def recv(self):
248248
self._check_closed()
249249
self._check_readable()
250250
buf = self._recv_bytes()
251-
return ForkingPickler.loads(buf.getbuffer())
251+
return _ForkingPickler.loads(buf.getbuffer())
252252

253253
def poll(self, timeout=0.0):
254254
"""Whether there is any input available to be read"""

Lib/multiprocessing/context.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import threading
44

55
from . import process
6+
from . import reduction
67

78
__all__ = [] # things are copied from here to __init__.py
89

@@ -198,6 +199,16 @@ def get_start_method(self, allow_none=False):
198199
def set_start_method(self, method=None):
199200
raise ValueError('cannot set start method of concrete context')
200201

202+
@property
203+
def reducer(self):
204+
'''Controls how objects will be reduced to a form that can be
205+
shared with other processes.'''
206+
return globals().get('reduction')
207+
208+
@reducer.setter
209+
def reducer(self, reduction):
210+
globals()['reduction'] = reduction
211+
201212
def _check_available(self):
202213
pass
203214

@@ -245,7 +256,6 @@ def get_all_start_methods(self):
245256
if sys.platform == 'win32':
246257
return ['spawn']
247258
else:
248-
from . import reduction
249259
if reduction.HAVE_SEND_HANDLE:
250260
return ['fork', 'spawn', 'forkserver']
251261
else:
@@ -292,7 +302,6 @@ class ForkServerContext(BaseContext):
292302
_name = 'forkserver'
293303
Process = ForkServerProcess
294304
def _check_available(self):
295-
from . import reduction
296305
if not reduction.HAVE_SEND_HANDLE:
297306
raise ValueError('forkserver start method not available')
298307

Lib/multiprocessing/forkserver.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from . import connection
1111
from . import process
12-
from . import reduction
12+
from .context import reduction
1313
from . import semaphore_tracker
1414
from . import spawn
1515
from . import util

Lib/multiprocessing/heap.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414
import tempfile
1515
import threading
1616

17-
from . import context
18-
from . import reduction
17+
from .context import reduction, assert_spawning
1918
from . import util
2019

2120
__all__ = ['BufferWrapper']
@@ -48,7 +47,7 @@ def __init__(self, size):
4847
self._state = (self.size, self.name)
4948

5049
def __getstate__(self):
51-
context.assert_spawning(self)
50+
assert_spawning(self)
5251
return self._state
5352

5453
def __setstate__(self, state):

Lib/multiprocessing/managers.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,9 @@
2323
from traceback import format_exc
2424

2525
from . import connection
26-
from . import context
26+
from .context import reduction, get_spawning_popen
2727
from . import pool
2828
from . import process
29-
from . import reduction
3029
from . import util
3130
from . import get_context
3231

@@ -833,7 +832,7 @@ def _after_fork(self):
833832

834833
def __reduce__(self):
835834
kwds = {}
836-
if context.get_spawning_popen() is not None:
835+
if get_spawning_popen() is not None:
837836
kwds['authkey'] = self._authkey
838837

839838
if getattr(self, '_isauto', False):

Lib/multiprocessing/popen_forkserver.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import io
22
import os
33

4-
from . import reduction
4+
from .context import reduction, set_spawning_popen
55
if not reduction.HAVE_SEND_HANDLE:
66
raise ImportError('No support for sending fds between processes')
7-
from . import context
87
from . import forkserver
98
from . import popen_fork
109
from . import spawn
@@ -42,12 +41,12 @@ def duplicate_for_child(self, fd):
4241
def _launch(self, process_obj):
4342
prep_data = spawn.get_preparation_data(process_obj._name)
4443
buf = io.BytesIO()
45-
context.set_spawning_popen(self)
44+
set_spawning_popen(self)
4645
try:
4746
reduction.dump(prep_data, buf)
4847
reduction.dump(process_obj, buf)
4948
finally:
50-
context.set_spawning_popen(None)
49+
set_spawning_popen(None)
5150

5251
self.sentinel, w = forkserver.connect_to_new_process(self._fds)
5352
util.Finalize(self, os.close, (self.sentinel,))

Lib/multiprocessing/popen_spawn_posix.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import io
22
import os
33

4-
from . import context
4+
from .context import reduction, set_spawning_popen
55
from . import popen_fork
6-
from . import reduction
76
from . import spawn
87
from . import util
98

@@ -42,12 +41,12 @@ def _launch(self, process_obj):
4241
self._fds.append(tracker_fd)
4342
prep_data = spawn.get_preparation_data(process_obj._name)
4443
fp = io.BytesIO()
45-
context.set_spawning_popen(self)
44+
set_spawning_popen(self)
4645
try:
4746
reduction.dump(prep_data, fp)
4847
reduction.dump(process_obj, fp)
4948
finally:
50-
context.set_spawning_popen(None)
49+
set_spawning_popen(None)
5150

5251
parent_r = child_w = child_r = parent_w = None
5352
try:

Lib/multiprocessing/popen_spawn_win32.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
import sys
55
import _winapi
66

7-
from . import context
7+
from .context import reduction, get_spawning_popen, set_spawning_popen
88
from . import spawn
9-
from . import reduction
109
from . import util
1110

1211
__all__ = ['Popen']
@@ -60,15 +59,15 @@ def __init__(self, process_obj):
6059
util.Finalize(self, _winapi.CloseHandle, (self.sentinel,))
6160

6261
# send information to child
63-
context.set_spawning_popen(self)
62+
set_spawning_popen(self)
6463
try:
6564
reduction.dump(prep_data, to_child)
6665
reduction.dump(process_obj, to_child)
6766
finally:
68-
context.set_spawning_popen(None)
67+
set_spawning_popen(None)
6968

7069
def duplicate_for_child(self, handle):
71-
assert self is context.get_spawning_popen()
70+
assert self is get_spawning_popen()
7271
return reduction.duplicate(handle, self.sentinel)
7372

7473
def wait(self, timeout=None):

Lib/multiprocessing/queues.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323

2424
from . import connection
2525
from . import context
26+
_ForkingPickler = context.reduction.ForkingPickler
2627

2728
from .util import debug, info, Finalize, register_after_fork, is_exiting
28-
from .reduction import ForkingPickler
2929

3030
#
3131
# Queue type using a pipe, buffer and thread
@@ -110,7 +110,7 @@ def get(self, block=True, timeout=None):
110110
finally:
111111
self._rlock.release()
112112
# unserialize the data after having released the lock
113-
return ForkingPickler.loads(res)
113+
return _ForkingPickler.loads(res)
114114

115115
def qsize(self):
116116
# Raises NotImplementedError on Mac OSX because of broken sem_getvalue()
@@ -238,7 +238,7 @@ def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe):
238238
return
239239

240240
# serialize the data before acquiring the lock
241-
obj = ForkingPickler.dumps(obj)
241+
obj = _ForkingPickler.dumps(obj)
242242
if wacquire is None:
243243
send_bytes(obj)
244244
else:
@@ -342,11 +342,11 @@ def get(self):
342342
with self._rlock:
343343
res = self._reader.recv_bytes()
344344
# unserialize the data after having released the lock
345-
return ForkingPickler.loads(res)
345+
return _ForkingPickler.loads(res)
346346

347347
def put(self, obj):
348348
# serialize the data before acquiring the lock
349-
obj = ForkingPickler.dumps(obj)
349+
obj = _ForkingPickler.dumps(obj)
350350
if self._wlock is None:
351351
# writes to a message oriented win32 pipe are atomic
352352
self._writer.send_bytes(obj)

Lib/multiprocessing/reduction.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# Licensed to PSF under a Contributor Agreement.
88
#
99

10+
from abc import ABCMeta, abstractmethod
1011
import copyreg
1112
import functools
1213
import io
@@ -238,3 +239,36 @@ def _rebuild_socket(df, family, type, proto):
238239
fd = df.detach()
239240
return socket.socket(family, type, proto, fileno=fd)
240241
register(socket.socket, _reduce_socket)
242+
243+
244+
class AbstractReducer(metaclass=ABCMeta):
245+
'''Abstract base class for use in implementing a Reduction class
246+
suitable for use in replacing the standard reduction mechanism
247+
used in multiprocessing.'''
248+
ForkingPickler = ForkingPickler
249+
register = register
250+
dump = dump
251+
send_handle = send_handle
252+
recv_handle = recv_handle
253+
254+
if sys.platform == 'win32':
255+
steal_handle = steal_handle
256+
duplicate = duplicate
257+
DupHandle = DupHandle
258+
else:
259+
sendfds = sendfds
260+
recvfds = recvfds
261+
DupFd = DupFd
262+
263+
_reduce_method = _reduce_method
264+
_reduce_method_descriptor = _reduce_method_descriptor
265+
_rebuild_partial = _rebuild_partial
266+
_reduce_socket = _reduce_socket
267+
_rebuild_socket = _rebuild_socket
268+
269+
def __init__(self, *args):
270+
register(type(_C().f), _reduce_method)
271+
register(type(list.append), _reduce_method_descriptor)
272+
register(type(int.__add__), _reduce_method_descriptor)
273+
register(functools.partial, _reduce_partial)
274+
register(socket.socket, _reduce_socket)

0 commit comments

Comments
 (0)