[Python-checkins] r70999 - in sandbox/trunk/2to3/lib2to3: main.py refactor.py

benjamin.peterson python-checkins at python.org
Thu Apr 2 00:36:47 CEST 2009


Author: benjamin.peterson
Date: Thu Apr 2 00:36:47 2009
New Revision: 70999
Log:
add very alpha support to 2to3 for running concurrently with multiprocessing
Modified:
 sandbox/trunk/2to3/lib2to3/main.py
 sandbox/trunk/2to3/lib2to3/refactor.py
Modified: sandbox/trunk/2to3/lib2to3/main.py
==============================================================================
--- sandbox/trunk/2to3/lib2to3/main.py	(original)
+++ sandbox/trunk/2to3/lib2to3/main.py	Thu Apr 2 00:36:47 2009
@@ -10,8 +10,12 @@
 
 from . import refactor
 
+HAVE_MULTIPROCESS = hasattr(refactor, "MultiprocessRefactoringTool")
 
-class StdoutRefactoringTool(refactor.RefactoringTool):
+base_refactor = getattr(refactor, "MultiprocessRefactoringTool",
+ refactor.RefactoringTool)
+
+class StdoutRefactoringTool(base_refactor):
 """
 Prints output to stdout.
 """
@@ -64,6 +68,9 @@
 help="Fix up doctests only")
 parser.add_option("-f", "--fix", action="append", default=[],
 help="Each FIX specifies a transformation; default: all")
+ if HAVE_MULTIPROCESS:
+ parser.add_option("-j", "--processes", action="store", default=1,
+ type="int", help="Run 2to3 concurrently")
 parser.add_option("-x", "--nofix", action="append", default=[],
 help="Prevent a fixer from being run.")
 parser.add_option("-l", "--list-fixes", action="store_true",
@@ -126,7 +133,8 @@
 if refactor_stdin:
 rt.refactor_stdin()
 else:
- rt.refactor(args, options.write, options.doctests_only)
+ rt.refactor(args, options.write, options.doctests_only,
+ options.processes)
 rt.summarize()
 
 # Return error status (0 if rt.errors is zero)
Modified: sandbox/trunk/2to3/lib2to3/refactor.py
==============================================================================
--- sandbox/trunk/2to3/lib2to3/refactor.py	(original)
+++ sandbox/trunk/2to3/lib2to3/refactor.py	Thu Apr 2 00:36:47 2009
@@ -506,6 +506,56 @@
 yield ""
 
 
+try:
+ import multiprocessing
+except ImportError:
+ pass
+else:
+ class MultiprocessRefactoringTool(RefactoringTool):
+
+ def __init__(self, *args, **kwargs):
+ super(MultiprocessRefactoringTool, self).__init__(*args, **kwargs)
+ self.queue = None
+
+ def refactor(self, items, write=False, doctests_only=False,
+ num_processes=1):
+ if num_processes == 1:
+ super(MultiprocessRefactoringTool, self).refactor(items, write,
+ doctests_only)
+ if self.queue is not None:
+ raise RuntimeError("already doing multiple processes")
+ self.queue = multiprocessing.JoinableQueue()
+ processes = [multiprocessing.Process(target=self._child)
+ for i in xrange(num_processes)]
+ try:
+ for p in processes:
+ p.start()
+ super(MultiprocessRefactoringTool, self).refactor(items, write,
+ doctests_only)
+ finally:
+ self.queue.join()
+ for i in xrange(num_processes):
+ self.queue.put(None)
+ for p in processes:
+ if p.is_alive():
+ p.join()
+ self.queue = None
+
+ def _child(self):
+ task = self.queue.get()
+ while task is not None:
+ args, kwargs = task
+ try:
+ super(MultiprocessRefactoringTool, self).refactor_file(
+ *args, **kwargs)
+ finally:
+ self.queue.task_done()
+ task = self.queue.get()
+
+ def refactor_file(self, *args, **kwargs):
+ self.queue.put((args, kwargs))
+
+
 def diff_texts(a, b, filename):
 """Return a unified diff of two strings."""
 a = a.splitlines()


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /