@@ -976,31 +976,42 @@ def det_parallelism(par=None, maxpar=None):
976976 Determine level of parallelism that should be used.
977977 Default: educated guess based on # cores and 'ulimit -u' setting: min(# cores, ((ulimit -u) - 15) // 6)
978978 """
979- if par is not None :
980- if not isinstance (par , int ):
979+ def get_default_parallelism ():
980+ try :
981+ # Get cache value if any
982+ par = det_parallelism ._default_parallelism
983+ except AttributeError :
984+ # No cache -> Calculate value from current system values
985+ par = get_avail_core_count ()
986+ # check ulimit -u
987+ out , ec = run_cmd ('ulimit -u' , force_in_dry_run = True , trace = False , stream_output = False )
981988 try :
982- par = int (par )
989+ if out .startswith ("unlimited" ):
990+ maxuserproc = 2 ** 32 - 1
991+ else :
992+ maxuserproc = int (out )
983993 except ValueError as err :
984- raise EasyBuildError ("Specified level of parallelism '%s' is not an integer value: %s" , par , err )
985- else :
986- par = get_avail_core_count ()
987- # check ulimit -u
988- out , ec = run_cmd ('ulimit -u' , force_in_dry_run = True , trace = False , stream_output = False )
989- try :
990- if out .startswith ("unlimited" ):
991- out = 2 ** 32 - 1
992- maxuserproc = int (out )
994+ raise EasyBuildError ("Failed to determine max user processes (%s, %s): %s" , ec , out , err )
993995 # assume 6 processes per build thread + 15 overhead
994- par_guess = int (( maxuserproc - 15 ) // 6 )
996+ par_guess = ( maxuserproc - 15 ) // 6
995997 if par_guess < par :
996998 par = par_guess
997- _log .info ("Limit parallel builds to %s because max user processes is %s" % (par , out ))
999+ _log .info ("Limit parallel builds to %s because max user processes is %s" , par , out )
1000+ # Cache value
1001+ det_parallelism ._default_parallelism = par
1002+ return par
1003+
1004+ if par is None :
1005+ par = get_default_parallelism ()
1006+ else :
1007+ try :
1008+ par = int (par )
9981009 except ValueError as err :
999- raise EasyBuildError ("Failed to determine max user processes (%s, %s) : %s" , ec , out , err )
1010+ raise EasyBuildError ("Specified level of parallelism '%s' is not an integer value : %s" , par , err )
10001011
10011012 if maxpar is not None and maxpar < par :
1002- _log .info ("Limiting parallellism from %s to %s" % ( par , maxpar ) )
1003- par = min ( par , maxpar )
1013+ _log .info ("Limiting parallellism from %s to %s" , par , maxpar )
1014+ par = maxpar
10041015
10051016 return par
10061017
0 commit comments