@@ -19,16 +19,14 @@ def partial_pi(args=(1000, )):
19
19
return 4.0 * nr_hits / nr_tries
20
20
21
21
22
- def compute_pi (nr_tries = 10000 , pool_size = None , constructor = None ):
22
+ def compute_pi (nr_tries = 10000 , pool_size = 1 , constructor = None ):
23
23
if not constructor :
24
24
executor = ProcessPoolExecutor (max_workers = pool_size )
25
25
else :
26
26
executor = constructor (max_workers = pool_size )
27
27
args = [(nr_tries // pool_size , )
28
28
for _ in range (pool_size )]
29
29
results = executor .map (partial_pi , args )
30
- if not pool_size :
31
- pool_size = multiprocessing .cpu_count ()
32
30
return sum (results )/ pool_size
33
31
34
32
@@ -37,21 +35,29 @@ def main():
37
35
arg_parser .add_argument ('--p' , dest = 'pool_size' , type = int ,
38
36
default = 1 , help = 'pool size' )
39
37
arg_parser .add_argument ('--n' , dest = 'nr_tries' , type = int ,
40
- default = 1 , help = 'number of tries' )
38
+ default = 1000 , help = 'number of tries' )
41
39
arg_parser .add_argument ('--t' , default = 'processes' , dest = 'type' ,
42
40
choices = ['processes' , 'threads' ],
43
41
help = 'Either use processes or treads' )
42
+ arg_parser .add_argument ('--verbose' , action = 'store_true' ,
43
+ help = 'generate verbose output' )
44
44
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
51
52
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} ' )
55
61
return 0
56
62
57
63
if __name__ == '__main__' :
0 commit comments