Пришло время для примеров, и начнем с того, как применять многопоточность! В Python, для этого обычно используется модуль
threading, однако в большинстве случаев более удобным выбором будет использовать concurrent.futures.Давайте рассмотрим пример, где мы выполняем запросы на веб-сайт (в данном случае, Яндекс).Я назвал эту функцию io_bound, потому что сделать HTTP-запрос является наиболее типичной io-bound задачей. На первой картинке мы выполняем 10 запросов последовательно, а на второй - используем многопоточность!
ThreadPoolExecutor создает определенное количество потоков (в данном случае 5, что регулируется параметром `max_workers`), выполняет задачи асинхронно в разных потоках и дожидается, пока каждый поток завершит работу.Время выполнения кода на первой картинке составляет 4 секунды, тогда как на второй - менее секунды 😲! Ваши результаты могут отличаться.
Буквально за две строчки мы получаем увеличение скорости выполнения нашего кода в 4-5 раз. Почему так происходит? Как упомянуто выше, выполнение HTTP-запроса является io-bound задачей, и большую часть времени мы ожидаем ответа от сервера Яндекса. Пока один поток ждет, другой может выполнить еще один запрос и передать управление следующему потоку. Таким образом, код с потоками не ждет ответа сервера, а выполняет запросы, пока есть доступные потоки.
Попробуйте написать такой код сами, поиграйте с параметром
max_workers, сравните время выполнения 🧑💻!В следующем посте разберем уже работу с несколько процессами❗️

