You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
parameterize what serialization is used in multiprocessing #72240
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee='https://github.com/applio'closed_at=Nonecreated_at=<Date2016-09-09.20:58:54.395>labels= ['3.7', 'type-feature', 'library']
title='parameterize what serialization is used in multiprocessing'updated_at=<Date2019-07-31.16:17:41.253>user='https://github.com/applio'
Currently multiprocessing uses the pickle module for its serialization of objects to be communicated between processes. Specifically v2 of the pickle protocols is now exclusively used to provide maximum compatibility, motivated by the desire for multiple versions of Python to be used simultaneously with multiprocessing.
Per conversations in bpo-26507, bpo-23403, and others, multiprocessing should offer the option to specify what serialization is to be used for the transport of data between processes. Besides supporting requests to use a different version of the pickle protocol or using 3rd party tools like dill, a hook to specify the means for reducing objects to a transmittable form opens a door for other creative or higher performance strategies.
Ultimately, this is not an enhancement to add functionality but rather to reorganize the existing internals of multiprocessing to permit better control over its use of serialization.
Documentation would be appreciated. I have a project that uses BaseManager, Client, and Listener to create some servers and clients. I would like to update the project to work with Python 3 and would prefer to update the clients and the servers separately (i.e. switch the client to Python 3 while the server is run with Python 2.7). However, BaseManager uses connection.Client which uses connection._ConnectionBase which uses reduction.ForkingPickler without a protocol argument. It seems the default protocol is 3 on Python 3.6 and 2 on Python 2.7 (contrary to the comment above about v2 being used). I just want to set the protocol version to 2 in Python 3.6. Can I do that with the changes added by this patch?
I'd like to know if the work here will be completed soon :-) This currently lacks documentation but also tests.
In particular, looking at the code (and that is supported by Will S' comment above), I feel the API isn't working as intended (i.e. setting the "reducer" property won't actually change the underlying parameters since the "reduction" module is imported eagerly).
Activity
applio commentedon Sep 9, 2016
Currently multiprocessing uses the pickle module for its serialization of objects to be communicated between processes. Specifically v2 of the pickle protocols is now exclusively used to provide maximum compatibility, motivated by the desire for multiple versions of Python to be used simultaneously with multiprocessing.
Per conversations in bpo-26507, bpo-23403, and others, multiprocessing should offer the option to specify what serialization is to be used for the transport of data between processes. Besides supporting requests to use a different version of the pickle protocol or using 3rd party tools like dill, a hook to specify the means for reducing objects to a transmittable form opens a door for other creative or higher performance strategies.
Ultimately, this is not an enhancement to add functionality but rather to reorganize the existing internals of multiprocessing to permit better control over its use of serialization.
applio commentedon Sep 9, 2016
Attaching patch containing refactorizations but missing update to docs for the purposes of review.
Introduces three new things:
ericsnowcurrently commentedon Sep 9, 2016
LGTM
python-dev commentedon Sep 9, 2016
New changeset 7381b1b50e00 by Davin Potts in branch 'default':
Issue bpo-28053: Applying refactorings, docs and other cleanup to follow.
https://hg.python.org/cpython/rev/7381b1b50e00
applio commentedon May 19, 2017
Docs need updating still.
WillS commentedon Jul 14, 2017
Documentation would be appreciated. I have a project that uses BaseManager, Client, and Listener to create some servers and clients. I would like to update the project to work with Python 3 and would prefer to update the clients and the servers separately (i.e. switch the client to Python 3 while the server is run with Python 2.7). However, BaseManager uses connection.Client which uses connection._ConnectionBase which uses reduction.ForkingPickler without a protocol argument. It seems the default protocol is 3 on Python 3.6 and 2 on Python 2.7 (contrary to the comment above about v2 being used). I just want to set the protocol version to 2 in Python 3.6. Can I do that with the changes added by this patch?
I tried creating pickle2reducer.py like this:
and then putting
at the top of my module before
but I still see "ValueError: unsupported pickle protocol: 3" on the server when I connect with a Python 3.6 client.
WillS commentedon Jul 28, 2017
Just to follow up in case anyone comes across my last message later:
I just had to change the last line from
to
pitrou commentedon Mar 31, 2018
I'd like to know if the work here will be completed soon :-) This currently lacks documentation but also tests.
In particular, looking at the code (and that is supported by Will S' comment above), I feel the API isn't working as intended (i.e. setting the "reducer" property won't actually change the underlying parameters since the "reduction" module is imported eagerly).