mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-11-04 09:57:43 +03:00 
			
		
		
		
	Merge pull request #721 from wiredfool/multiprocessing_build
Multiprocessing build
This commit is contained in:
		
						commit
						ca64211447
					
				| 
						 | 
					@ -3,6 +3,8 @@ language: python
 | 
				
			||||||
notifications:
 | 
					notifications:
 | 
				
			||||||
  irc: "chat.freenode.net#pil"
 | 
					  irc: "chat.freenode.net#pil"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					env: MAX_CONCURRENCY=4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
python:
 | 
					python:
 | 
				
			||||||
  - "pypy"
 | 
					  - "pypy"
 | 
				
			||||||
  - 2.6
 | 
					  - 2.6
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										50
									
								
								mp_compile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								mp_compile.py
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					# A monkey patch of the base distutils.ccompiler to use parallel builds
 | 
				
			||||||
 | 
					# Tested on 2.7, looks to be identical to 3.3.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from multiprocessing import Pool, cpu_count
 | 
				
			||||||
 | 
					from distutils.ccompiler import CCompiler
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# hideous monkeypatching.  but. but. but.
 | 
				
			||||||
 | 
					def _mp_compile_one(tp):
 | 
				
			||||||
 | 
					    (self, obj, build, cc_args, extra_postargs, pp_opts) = tp
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        src, ext = build[obj]
 | 
				
			||||||
 | 
					    except KeyError:
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def _mp_compile(self, sources, output_dir=None, macros=None,
 | 
				
			||||||
 | 
					                include_dirs=None, debug=0, extra_preargs=None,
 | 
				
			||||||
 | 
					                extra_postargs=None, depends=None):
 | 
				
			||||||
 | 
					    """Compile one or more source files.
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    see distutils.ccompiler.CCompiler.compile for comments.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    # A concrete compiler class can either override this method
 | 
				
			||||||
 | 
					    # entirely or implement _compile().
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    macros, objects, extra_postargs, pp_opts, build = \
 | 
				
			||||||
 | 
					            self._setup_compile(output_dir, macros, include_dirs, sources,
 | 
				
			||||||
 | 
					                                depends, extra_postargs)
 | 
				
			||||||
 | 
					    cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        max_procs = int(os.environ.get('MAX_CONCURRENCY', cpu_count()))
 | 
				
			||||||
 | 
					    except:
 | 
				
			||||||
 | 
					        max_procs = None
 | 
				
			||||||
 | 
					    pool = Pool(max_procs)
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        print ("Building using %d processes" % pool._processes)
 | 
				
			||||||
 | 
					    except: pass
 | 
				
			||||||
 | 
					    arr = [(self, obj, build, cc_args, extra_postargs, pp_opts) for obj in objects]
 | 
				
			||||||
 | 
					    results = pool.map_async(_mp_compile_one,arr)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    pool.close()
 | 
				
			||||||
 | 
					    pool.join()
 | 
				
			||||||
 | 
					    # Return *all* object filenames, not just the ones we just built.
 | 
				
			||||||
 | 
					    return objects
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CCompiler.compile = _mp_compile
 | 
				
			||||||
							
								
								
									
										5
									
								
								setup.py
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								setup.py
									
									
									
									
									
								
							| 
						 | 
					@ -14,6 +14,8 @@ import re
 | 
				
			||||||
import struct
 | 
					import struct
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import mp_compile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from distutils.command.build_ext import build_ext
 | 
					from distutils.command.build_ext import build_ext
 | 
				
			||||||
from distutils import sysconfig
 | 
					from distutils import sysconfig
 | 
				
			||||||
from setuptools import Extension, setup, find_packages
 | 
					from setuptools import Extension, setup, find_packages
 | 
				
			||||||
| 
						 | 
					@ -705,7 +707,8 @@ class pil_build_ext(build_ext):
 | 
				
			||||||
        finally:
 | 
					        finally:
 | 
				
			||||||
            os.unlink(tmpfile)
 | 
					            os.unlink(tmpfile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
setup(
 | 
					if __name__=='__main__':
 | 
				
			||||||
 | 
					    setup(
 | 
				
			||||||
        name=NAME,
 | 
					        name=NAME,
 | 
				
			||||||
        version=VERSION,
 | 
					        version=VERSION,
 | 
				
			||||||
        description='Python Imaging Library (Fork)',
 | 
					        description='Python Imaging Library (Fork)',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user