@@ -19,16 +19,14 @@ def partial_pi(args=(1000, )):
1919 return 4.0 * nr_hits / nr_tries
2020
2121
22- def compute_pi (nr_tries = 10000 , pool_size = None , constructor = None ):
22+ def compute_pi (nr_tries = 10000 , pool_size = 1 , constructor = None ):
2323 if not constructor :
2424 executor = ProcessPoolExecutor (max_workers = pool_size )
2525 else :
2626 executor = constructor (max_workers = pool_size )
2727 args = [(nr_tries // pool_size , )
2828 for _ in range (pool_size )]
2929 results = executor .map (partial_pi , args )
30- if not pool_size :
31- pool_size = multiprocessing .cpu_count ()
3230 return sum (results )/ pool_size
3331
3432
@@ -37,21 +35,29 @@ def main():
3735 arg_parser .add_argument ('--p' , dest = 'pool_size' , type = int ,
3836 default = 1 , help = 'pool size' )
3937 arg_parser .add_argument ('--n' , dest = 'nr_tries' , type = int ,
40- default = 1 , help = 'number of tries' )
38+ default = 1000 , help = 'number of tries' )
4139 arg_parser .add_argument ('--t' , default = 'processes' , dest = 'type' ,
4240 choices = ['processes' , 'threads' ],
4341 help = 'Either use processes or treads' )
42+ arg_parser .add_argument ('--verbose' , action = 'store_true' ,
43+ help = 'generate verbose output' )
4444 options = arg_parser .parse_args ()
45- if options .type :
46- if options .type == 'processes' :
47- constructor = ProcessPoolExecutor
48- else :
49- constructor = ThreadPoolExecutor
50- my_pi = compute_pi (options .nr_tries , options .pool_size , constructor )
45+ if options .nr_tries // options .pool_size == 0 :
46+ print (f'#error: too little work, increase --n value to at least '
47+ f'{ options .pool_size } ' ,
48+ file = sys .stderr )
49+ sys .exit (1 )
50+ if options .type == 'processes' :
51+ constructor = ProcessPoolExecutor
5152 else :
52- my_pi = compute_pi (options .nr_tries , options .pool_size )
53- print ('computed pi = {0:.15f}' .format (my_pi ))
54- print ('exact pi = {0:.15f}' .format (math .pi ))
53+ constructor = ThreadPoolExecutor
54+ if options .verbose :
55+ print (f'# running using { options .pool_size } { options .type } on '
56+ f'{ multiprocessing .cpu_count ()} logical cores' ,
57+ file = sys .stderr )
58+ my_pi = compute_pi (options .nr_tries , options .pool_size , constructor )
59+ print (f'computed pi = { my_pi :.15f} ' )
60+ print (f'exact pi = { math .pi :.15f} ' )
5561 return 0
5662
5763if __name__ == '__main__' :
0 commit comments