In this chapter, you learned how to use concurrent.futures to make a particularly common multiprocess case extremely simply. We also saw how to use the multiprocessing package to define what worker processes do and how they interact.
So, now we know quite a lot about how to help CPU-bound programs take advantage of multicore and multiprocessor hardware to run faster. Most programs aren't CPU-bound though, they're I/O-bound, which means they spend most of their time waiting for input from various sources. Parallel processing doesn't help in that situation, but asynchronous I/O does, and that's the topic for our next chapter.