advice on sub-classing multiprocessing.Process andmultiprocessing.BaseManager

M

Matt Newville

I'm maintaining a python interface to a C library for a distributed
control system (EPICS, sort of a SCADA system) that does a large
amount of relatively light-weight network I/O. In order to keep many
connections open and responsive, and to provide a simple interface,
the python library keeps a global store of connection state.

This works well for single processes and threads, but not so well for
multiprocessing, where the global state causes trouble. The issue is
not too difficult to work around (ie, completely clear any such global
cache and insist that new connections be established in each process),
but easy to forget.

To make this easier, I have a function to clear the global cache,

def clear_my_cache():
# empty global variables caching network connections
return

and then subclass of multiprocessing.Process like:

class MyProcess(multiprocessing.Process):
def __init__(self, **kws):
multiprocessing.Process.__init__(self, **kws)

def run(self):
clear_my_cache()
mp.Process.run(self)

This works fine. I can subclass multiprocessing.pool.Pool too, as it
uses Process as a class variable (removing doc strings):

class Pool(object):
Process = Process

def __init__(self, processes=None, initializer=None, initargs=(),
maxtasksperchild=None):

and then uses self.Process in its Pool._repopulate_pool(). That makes
subclassing Pool is as easy as (removing doc strings):

class MyPool(multiprocssing.pool.Pool):
def __init__(self, **kws):
self.Process = MyProcess
mp_pool.Pool.__init__(self, **kws)

I'm very pleased to need so little code here! But, I run into trouble
when I try to subclass any of the Managers(). It looks like I would
have to make a nearly-identical copy of ~30 lines of
BaseManager.start() as it calls multiprocessing.Process() to create
processes there. In addition, it looks like subclassing
multiprocessing.managers.SyncManager would mean making a
near-identical copy of a similar amount of code.

I'd be willing to do this, but it seems like a bad idea -- I much
prefer overwriting self.Process as for Pool.

Does anyone have any advice for the best approach here? Should, like
Pool, BaseManager also use a class variable (Process = Process)?

Thanks in advance for any advice.

--Matt
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,754
Messages
2,569,527
Members
44,998
Latest member
MarissaEub

Latest Threads

Top