ch19: fixed race condition in procs.py

This commit is contained in:
Luciano Ramalho
2021-09-21 18:03:34 -03:00
parent 3ecfb212c6
commit 2c1230579d

View File

@@ -30,6 +30,7 @@ def check(n: int) -> PrimeResult: # <6>
def worker(jobs: JobQueue, results: ResultQueue) -> None: # <7> def worker(jobs: JobQueue, results: ResultQueue) -> None: # <7>
while n := jobs.get(): # <8> while n := jobs.get(): # <8>
results.put(check(n)) # <9> results.put(check(n)) # <9>
results.put(PrimeResult(0, False, 0.0)) # <10>
# end::PRIMES_PROC_TOP[] # end::PRIMES_PROC_TOP[]
# tag::PRIMES_PROC_MAIN[] # tag::PRIMES_PROC_MAIN[]
@@ -53,15 +54,19 @@ def main() -> None:
proc.start() # <5> proc.start() # <5>
jobs.put(0) # <6> jobs.put(0) # <6>
while True: workers_done = 0
n, prime, elapsed = results.get() # <7> checked = 0
label = 'P' if prime else ' ' while workers_done < workers: # <7>
print(f'{n:16} {label} {elapsed:9.6f}s') # <8> n, prime, elapsed = results.get() # <8>
if jobs.empty(): # <9> if n == 0:
break workers_done += 1 # <9>
else:
checked += 1
label = 'P' if prime else ' '
print(f'{n:16} {label} {elapsed:9.6f}s') # <10>
elapsed = perf_counter() - t0 elapsed = perf_counter() - t0
print(f'Total time: {elapsed:.2f}s') print(f'{checked} checks in {elapsed:.2f}s') # <11>
if __name__ == '__main__': if __name__ == '__main__':
main() main()