Мы уже пользовались threading.Thread и multiprocessing.Process напрямую в предыдущих уроках. concurrent.futures даёт единый, более высокоуровневый интерфейс для обоих случаев - пул воркеров, куда можно скидывать задачи, не думая вручную про создание, запуск и .join() каждого потока или процесса по отдельности.