1+ #!/usr/bin/env python3
2+
3+ """
4+ procs.py: shows that multiprocessing on a multicore machine
5+ can be faster than sequential code for CPU-intensive work.
6+ """
7+
18# tag::PRIMES_PROC_TOP[]
29from time import perf_counter
3- from typing import Tuple , NamedTuple
10+ from typing import NamedTuple
411from multiprocessing import Process , SimpleQueue , cpu_count # <1>
512from multiprocessing import queues # <2>
613import sys
714
815from primes import is_prime , NUMBERS
916
10- class Result (NamedTuple ): # <3>
11- flag : bool
17+ class PrimeResult (NamedTuple ): # <3>
18+ n : int
19+ prime : bool
1220 elapsed : float
1321
1422JobQueue = queues .SimpleQueue [int ] # <4>
15- ResultQueue = queues .SimpleQueue [Tuple [ int , Result ] ] # <5>
23+ ResultQueue = queues .SimpleQueue [PrimeResult ] # <5>
1624
17- def check (n : int ) -> Result : # <6>
25+ def check (n : int ) -> PrimeResult : # <6>
1826 t0 = perf_counter ()
1927 res = is_prime (n )
20- return Result ( res , perf_counter () - t0 )
28+ return PrimeResult ( n , res , perf_counter () - t0 )
2129
2230def worker (jobs : JobQueue , results : ResultQueue ) -> None : # <7>
2331 while n := jobs .get (): # <8>
24- result = check (n ) # <9>
25- results .put ((n , result )) # <10>
32+ results .put (check (n )) # <9>
2633# end::PRIMES_PROC_TOP[]
2734
2835# tag::PRIMES_PROC_MAIN[]
@@ -32,11 +39,11 @@ def main() -> None:
3239 else :
3340 workers = int (sys .argv [1 ])
3441
35- t0 = perf_counter ()
42+ print (f'Checking { len (NUMBERS )} numbers with { workers } processes:' )
43+
3644 jobs : JobQueue = SimpleQueue () # <2>
3745 results : ResultQueue = SimpleQueue ()
38-
39- print (f'Checking { len (NUMBERS )} numbers with { workers } processes:' )
46+ t0 = perf_counter ()
4047
4148 for n in NUMBERS : # <3>
4249 jobs .put (n )
@@ -47,7 +54,7 @@ def main() -> None:
4754 jobs .put (0 ) # <6>
4855
4956 while True :
50- n , ( prime , elapsed ) = results .get () # <7>
57+ n , prime , elapsed = results .get () # <7>
5158 label = 'P' if prime else ' '
5259 print (f'{ n :16} { label } { elapsed :9.6f} s' ) # <8>
5360 if jobs .empty (): # <9>
0 commit comments