|
| 1 | +# Race condition in orignal procs.py |
| 2 | + |
| 3 | +Thanks to reader Michael Albert who noticed the code I published during the Early Release had a race condition in `proc.py`. |
| 4 | + |
| 5 | +If you are curious, |
| 6 | +[this diff](https://github.com/fluentpython/example-code-2e/commit/2c1230579db99738a5e5e6802063bda585f6476d) |
| 7 | +shows the bug and how I fixed it—but note that I later refactored |
| 8 | +the example to delegate parts of `main` to the `start_jobs` and `report` functions. |
| 9 | + |
| 10 | +The problem was that I ended the `while` loop that retrieved the results when the `jobs` queue was empty. |
| 11 | +However, it was possible that the queue was empty but there were still processes working. |
| 12 | +If that happened, one or more results would not be reported. |
| 13 | +I did not notice the problem when I tested my original code, |
| 14 | +but Albert showed that adding a `sleep(1)` call before the `if jobs.empty()` line made the bug occur frequently. |
| 15 | +I adopted one of his solutions: have the `worker` function send back a `PrimeResult` with `n = 0` as a sentinel, |
| 16 | +to let the main loop know that the process had completed, ending the loop when all processes were done. |
0 commit comments