Skip to content

Commit f1f3845

Browse files
committed
RF: Comprehensive non-daemon subclassing of contexts
1 parent 7f4660f commit f1f3845

File tree

1 file changed

+47
-8
lines changed

1 file changed

+47
-8
lines changed

nipype/pipeline/plugins/legacymultiproc.py

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
# Import packages
1313
import os
14+
import multiprocessing as mp
1415
from multiprocessing import Pool, cpu_count, pool
1516
from traceback import format_exception
1617
import sys
@@ -85,15 +86,53 @@ def daemon(self):
8586
def daemon(self, val):
8687
pass
8788

89+
try:
90+
from multiprocessing import context
91+
# Exists on all platforms
92+
class NonDaemonSpawnProcess(NonDaemonMixin, context.SpawnProcess):
93+
pass
94+
class NonDaemonSpawnContext(context.SpawnContext):
95+
Process = NonDaemonSpawnProcess
96+
_nondaemon_context_mapper = {
97+
'spawn': NonDaemonSpawnContext()
98+
}
8899

89-
class NonDaemonPool(pool.Pool):
90-
"""A process pool with non-daemon processes.
91-
"""
92-
def Process(self, *args, **kwds):
93-
proc = super(NonDaemonPool, self).Process(*args, **kwds)
94-
# Monkey-patch newly created processes to ensure they are never daemonized
95-
proc.__class__ = type(str('NonDaemonProcess'), (NonDaemonMixin, proc.__class__), {})
96-
return proc
100+
# POSIX only
101+
try:
102+
class NonDaemonForkProcess(NonDaemonMixin, context.ForkProcess):
103+
pass
104+
class NonDaemonForkContext(context.ForkContext):
105+
Process = NonDaemonForkProcess
106+
_nondaemon_context_mapper['fork'] = NonDaemonForkContext()
107+
except AttributeError:
108+
pass
109+
# POSIX only
110+
try:
111+
class NonDaemonForkServerProcess(NonDaemonMixin, context.ForkServerProcess):
112+
pass
113+
class NonDaemonForkServerContext(context.ForkServerContext):
114+
Process = NonDaemonForkServerProcess
115+
_nondaemon_context_mapper['forkserver'] = NonDaemonForkServerContext()
116+
except AttributeError:
117+
pass
118+
119+
class NonDaemonPool(pool.Pool):
120+
def __init__(self, processes=None, initializer=None, initargs=(),
121+
maxtasksperchild=None, context=None):
122+
if context is None:
123+
context = mp.get_context()
124+
context = _nondaemon_context_mapper[context._name]
125+
super(NonDaemonPool, self).__init__(processes=processes,
126+
initializer=initializer,
127+
initargs=initargs,
128+
maxtasksperchild=maxtasksperchild,
129+
context=context)
130+
131+
except ImportError:
132+
class NonDaemonProcess(NonDaemonMixin, mp.Process):
133+
pass
134+
class NonDaemonPool(pool.Pool):
135+
Process = NonDaemonProcess
97136

98137

99138
class LegacyMultiProcPlugin(DistributedPluginBase):

0 commit comments

Comments
 (0)