summaryrefslogtreecommitdiffstats
path: root/nova/process.py
diff options
context:
space:
mode:
authorEwan Mellor <ewan.mellor@citrix.com>2010-07-24 02:49:20 +0100
committerEwan Mellor <ewan.mellor@citrix.com>2010-07-24 02:49:20 +0100
commiteffbd4b4c7077043c0ff2ddcb91607b4e79796f6 (patch)
treea9a4c628533c64211b349c9c3d713ddd9b113c8f /nova/process.py
parent1046fd21fad35fdb9922f667017937ec94774498 (diff)
parent809a1fe80b9922a36c64bce948588a5797cae87b (diff)
downloadnova-effbd4b4c7077043c0ff2ddcb91607b4e79796f6.tar.gz
nova-effbd4b4c7077043c0ff2ddcb91607b4e79796f6.tar.xz
nova-effbd4b4c7077043c0ff2ddcb91607b4e79796f6.zip
Merged with trunk, since a lot of useful things have gone in there recently.
Diffstat (limited to 'nova/process.py')
-rw-r--r--nova/process.py47
1 files changed, 13 insertions, 34 deletions
diff --git a/nova/process.py b/nova/process.py
index ff789a08a..d3558ed2e 100644
--- a/nova/process.py
+++ b/nova/process.py
@@ -85,7 +85,7 @@ class _BackRelay(protocol.ProcessProtocol):
def errReceivedIsBad(self, text):
if self.deferred is not None:
self.onProcessEnded = defer.Deferred()
- err = _UnexpectedErrorOutput(text, self.onProcessEnded)
+ err = UnexpectedErrorOutput(text, self.onProcessEnded)
self.deferred.errback(failure.Failure(err))
self.deferred = None
self.transport.loseConnection()
@@ -152,8 +152,8 @@ def getProcessOutput(executable, args=None, env=None, path=None, reactor=None,
d = defer.Deferred()
p = BackRelayWithInput(
d, startedDeferred=startedDeferred, error_ok=error_ok, input=input)
- # VISH: commands come in as unicode, but self.executes needs
- # strings or process.spawn raises a deprecation warning
+ # NOTE(vish): commands come in as unicode, but self.executes needs
+ # strings or process.spawn raises a deprecation warning
executable = str(executable)
if not args is None:
args = [str(x) for x in args]
@@ -171,7 +171,7 @@ class ProcessPool(object):
self.size = size and size or FLAGS.process_pool_size
self._pool = defer.DeferredSemaphore(self.size)
- def simpleExecute(self, cmd, **kw):
+ def simple_execute(self, cmd, **kw):
""" Weak emulation of the old utils.execute() function.
This only exists as a way to quickly move old execute methods to
@@ -205,34 +205,13 @@ class ProcessPool(object):
self._pool.release()
return rv
+class SharedPool(ProcessPool):
+ _instance = None
+ def __new__(cls, *args, **kwargs):
+ if not cls._instance:
+ cls._instance = super(SharedPool, cls).__new__(
+ cls, *args, **kwargs)
+ return cls._instance
-class Pool(object):
- """ A simple process pool implementation around mutliprocessing.
-
- Allows up to `size` processes at a time and queues the rest.
-
- Using workarounds for multiprocessing behavior described in:
- http://pypi.python.org/pypi/twisted.internet.processes/1.0b1
- """
-
- def __init__(self, size=None):
- self._size = size
- self._pool = multiprocessing.Pool(size)
- self._registerShutdown()
-
- def _registerShutdown(self):
- reactor.addSystemEventTrigger(
- 'during', 'shutdown', self.shutdown, reactor)
-
- def shutdown(self, reactor=None):
- if not self._pool:
- return
- self._pool.close()
- # wait for workers to finish
- self._pool.terminate()
- self._pool = None
-
- def apply(self, f, *args, **kw):
- """ Add a task to the pool and return a deferred. """
- result = self._pool.apply_async(f, args, kw)
- return threads.deferToThread(result.get)
+def simple_execute(cmd, **kwargs):
+ return SharedPool().simple_execute(cmd, **kwargs)