Added Monkeypatch to make multiprocessing work with a list of queues in the manager
This commit is contained in:
parent
547b00f116
commit
b9e31d79fd
57
lasp/lasp_multiprocessingpatch.py
Normal file
57
lasp/lasp_multiprocessingpatch.py
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Author: J.A. de Jong
|
||||||
|
|
||||||
|
Description: MonkeyPatch required to let the Multiprocessing library work properly.
|
||||||
|
Should be applied prior to running any other multiprocessing code. Comes from
|
||||||
|
Stackoverflow and is mainly used for managing a list of queues that can be
|
||||||
|
shared between processes.
|
||||||
|
|
||||||
|
For more information, see:
|
||||||
|
https://stackoverflow.com/questions/46779860/multiprocessing-managers-and-custom-classes
|
||||||
|
"""
|
||||||
|
from multiprocessing import managers
|
||||||
|
import logging
|
||||||
|
from functools import wraps
|
||||||
|
from inspect import signature
|
||||||
|
|
||||||
|
orig_AutoProxy = managers.AutoProxy
|
||||||
|
|
||||||
|
__all__ = ['apply_patch']
|
||||||
|
|
||||||
|
|
||||||
|
@wraps(managers.AutoProxy)
|
||||||
|
def AutoProxy(*args, incref=True, manager_owned=False, **kwargs):
|
||||||
|
# Create the autoproxy without the manager_owned flag, then
|
||||||
|
# update the flag on the generated instance. If the manager_owned flag
|
||||||
|
# is set, `incref` is disabled, so set it to False here for the same
|
||||||
|
# result.
|
||||||
|
autoproxy_incref = False if manager_owned else incref
|
||||||
|
proxy = orig_AutoProxy(*args, incref=autoproxy_incref, **kwargs)
|
||||||
|
proxy._owned_by_manager = manager_owned
|
||||||
|
return proxy
|
||||||
|
|
||||||
|
|
||||||
|
def apply_patch():
|
||||||
|
if "manager_owned" in signature(managers.AutoProxy).parameters:
|
||||||
|
return
|
||||||
|
|
||||||
|
logging.debug("Patching multiprocessing.managers.AutoProxy to add manager_owned")
|
||||||
|
managers.AutoProxy = AutoProxy
|
||||||
|
|
||||||
|
# re-register any types already registered to SyncManager without a custom
|
||||||
|
# proxy type, as otherwise these would all be using the old unpatched AutoProxy
|
||||||
|
SyncManager = managers.SyncManager
|
||||||
|
registry = managers.SyncManager._registry
|
||||||
|
for typeid, (callable, exposed, method_to_typeid, proxytype) in registry.items():
|
||||||
|
if proxytype is not orig_AutoProxy:
|
||||||
|
continue
|
||||||
|
create_method = hasattr(managers.SyncManager, typeid)
|
||||||
|
SyncManager.register(
|
||||||
|
typeid,
|
||||||
|
callable=callable,
|
||||||
|
exposed=exposed,
|
||||||
|
method_to_typeid=method_to_typeid,
|
||||||
|
create_method=create_method,
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user