From 117c97ba6b9285688d65948b346fbf93089181d1 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Thu, 25 Oct 2018 12:41:46 -0400 Subject: [PATCH 1/4] FIX: Python 2.7-3.7.1 compatible NonDaemonPool --- nipype/pipeline/plugins/legacymultiproc.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/nipype/pipeline/plugins/legacymultiproc.py b/nipype/pipeline/plugins/legacymultiproc.py index d93e6e77d1..b1e9b49cf8 100644 --- a/nipype/pipeline/plugins/legacymultiproc.py +++ b/nipype/pipeline/plugins/legacymultiproc.py @@ -90,7 +90,16 @@ def _set_daemon(self, value): class NonDaemonPool(pool.Pool): """A process pool with non-daemon processes. """ - Process = NonDaemonProcess + def Process(self, *args, **kwds): + if hasattr(self, '_ctx'): + ctx = self._ctx + if isinstance(args[0], multiprocessing.context.BaseContext): + ctx = args.pop(0) + process = ctx.Process + kwds['daemon'] = False + else: + process = NonDaemonProcess + return process(*args, **kwds) class LegacyMultiProcPlugin(DistributedPluginBase): From 5aea31651a61c7da0a2da9615aebeae372fc1e33 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Thu, 25 Oct 2018 13:09:58 -0400 Subject: [PATCH 2/4] FIX: Empty lists for 3.4<=Python<3.7, missing import for 3.7 --- nipype/pipeline/plugins/legacymultiproc.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/nipype/pipeline/plugins/legacymultiproc.py b/nipype/pipeline/plugins/legacymultiproc.py index b1e9b49cf8..0e088a1b8d 100644 --- a/nipype/pipeline/plugins/legacymultiproc.py +++ b/nipype/pipeline/plugins/legacymultiproc.py @@ -11,7 +11,8 @@ # Import packages import os -from multiprocessing import Process, Pool, cpu_count, pool +import multiprocessing as mp +from multiprocessing import Pool, cpu_count, pool from traceback import format_exception import sys from logging import INFO @@ -74,7 +75,7 @@ def run_node(node, updatehash, taskid): return result -class NonDaemonProcess(Process): +class NonDaemonProcess(mp.Process): """A non-daemon process to support internal multiprocessing. """ @@ -93,7 +94,7 @@ class NonDaemonPool(pool.Pool): def Process(self, *args, **kwds): if hasattr(self, '_ctx'): ctx = self._ctx - if isinstance(args[0], multiprocessing.context.BaseContext): + if args and isinstance(args[0], mp.context.BaseContext): ctx = args.pop(0) process = ctx.Process kwds['daemon'] = False From 8031fac2e2c3e0c9695994cb507039bca965f1e3 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Thu, 25 Oct 2018 13:39:02 -0400 Subject: [PATCH 3/4] FIX: Full-on monkey patch --- nipype/pipeline/plugins/legacymultiproc.py | 34 ++++++++-------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/nipype/pipeline/plugins/legacymultiproc.py b/nipype/pipeline/plugins/legacymultiproc.py index 0e088a1b8d..a18abeda86 100644 --- a/nipype/pipeline/plugins/legacymultiproc.py +++ b/nipype/pipeline/plugins/legacymultiproc.py @@ -75,32 +75,22 @@ def run_node(node, updatehash, taskid): return result -class NonDaemonProcess(mp.Process): - """A non-daemon process to support internal multiprocessing. - """ - - def _get_daemon(self): - return False - - def _set_daemon(self, value): - pass - - daemon = property(_get_daemon, _set_daemon) - - class NonDaemonPool(pool.Pool): """A process pool with non-daemon processes. """ def Process(self, *args, **kwds): - if hasattr(self, '_ctx'): - ctx = self._ctx - if args and isinstance(args[0], mp.context.BaseContext): - ctx = args.pop(0) - process = ctx.Process - kwds['daemon'] = False - else: - process = NonDaemonProcess - return process(*args, **kwds) + proc = super(NonDaemonPool, self).Process(*args, **kwds) + class NonDaemonProcess(proc.__class__): + """Monkey-patch process to ensure it is never daemonized""" + @property + def daemon(self): + return False + + @daemon.setter + def daemon(self, val): + pass + proc.__class__ = NonDaemonProcess + return proc class LegacyMultiProcPlugin(DistributedPluginBase): From c9a787ed70c55b86c84ea21631258fdbd256652a Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Thu, 25 Oct 2018 13:59:16 -0400 Subject: [PATCH 4/4] STY: Cleanup + unused import [skip ci] --- nipype/pipeline/plugins/legacymultiproc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/pipeline/plugins/legacymultiproc.py b/nipype/pipeline/plugins/legacymultiproc.py index a18abeda86..dd88a55055 100644 --- a/nipype/pipeline/plugins/legacymultiproc.py +++ b/nipype/pipeline/plugins/legacymultiproc.py @@ -11,7 +11,6 @@ # Import packages import os -import multiprocessing as mp from multiprocessing import Pool, cpu_count, pool from traceback import format_exception import sys @@ -80,6 +79,7 @@ class NonDaemonPool(pool.Pool): """ def Process(self, *args, **kwds): proc = super(NonDaemonPool, self).Process(*args, **kwds) + class NonDaemonProcess(proc.__class__): """Monkey-patch process to ensure it is never daemonized""" @property