summaryrefslogtreecommitdiff
path: root/scipy/base/pexec.py
diff options
context:
space:
mode:
Diffstat (limited to 'scipy/base/pexec.py')
-rw-r--r--scipy/base/pexec.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/scipy/base/pexec.py b/scipy/base/pexec.py
new file mode 100644
index 000000000..4fe90e49a
--- /dev/null
+++ b/scipy/base/pexec.py
@@ -0,0 +1,63 @@
+#
+# Title: Provides ParallelExec to execute commands in
+# other (background or parallel) threads.
+# Author: Pearu Peteson <pearu@cens.ioc.ee>
+# Created: October, 2003
+#
+
+__all__ = ['ParallelExec']
+
+import sys
+import threading
+import Queue
+import traceback
+import types
+import inspect
+import time
+import atexit
+
+class ParallelExec(threading.Thread):
+ """ Create a thread of parallel execution.
+ """
+ def __init__(self):
+ threading.Thread.__init__(self)
+ self.__queue = Queue.Queue(0)
+ self.__frame = sys._getframe(1)
+ self.setDaemon(1)
+ self.start()
+
+ def __call__(self,code,frame=None,wait=0):
+ """ Execute code in parallel thread inside given frame (default
+ frame is where this instance was created).
+ If wait is True then __call__ returns after code is executed,
+ otherwise code execution happens in background.
+ """
+ if wait:
+ wait_for_code = threading.Event()
+ else:
+ wait_for_code = None
+ self.__queue.put((code,frame,wait_for_code))
+ if wait:
+ wait_for_code.wait()
+
+ def shutdown(self):
+ """ Shutdown parallel thread."""
+ self.__queue.put((None,None,None))
+
+ def run(self):
+ """ Called by threading.Thread."""
+ while 1:
+ code, frame, wait_for_code = self.__queue.get()
+ if code is None:
+ break
+ if frame is None:
+ frame = self.__frame
+ try:
+ exec (code, frame.f_globals,frame.f_locals)
+ except Exception:
+ try:
+ traceback.print_exc()
+ except AttributeError:
+ pass
+ if wait_for_code is not None:
+ wait_for_code.set()