Скидка до 57% и подарки на 135 000 ₽
15 янв 2025
8 минут

Многопоточность в Python

Python
Программирование

Что такое многопоточность в Python?

Многопоточность в Python — способ сделать так, чтобы программа могла выполнять сразу несколько задач одновременно. Например, пока одна задача считает числа, другая может подгружать данные из базы. Для этого создаются потоки (threads) — как дополнительные инструменты, которые работают внутри программы.

Пример применения многопоточности:

  • Онлайн-магазин одновременно обрабатывает заказы, обновляет информацию о наличии товаров на складе и отправляет уведомления пользователям.
  • Программа для мониторинга серверов собирает данные о нагрузке и доступности из разных регионов, обновляя дашборд в реальном времени.
Схема общей структуры многопоточности в Python
Один процесс разделяется на потоки для задач

Почему курсы

Сегодня курсы — это возможность быстро освоить востребованные профессии, особенно в digital-сфере. Вот несколько специальностей, которые можно изучить с нуля, и начать карьеру уже через несколько месяцев.
import threading
def count_down(start):
    """
    Отсчитывает числа от заданного значения до 1.
    """
    for i in range(start, 0, -1):
        print(f"Countdown: {i}")
# Создаем два потока с разным начальным значением отсчета
thread1 = threading.Thread(target=count_down, args=(5,))
thread2 = threading.Thread(target=count_down, args=(3,))
# Запускаем потоки
thread1.start()
thread2.start()
# Ожидаем завершения 
thread1.join()
thread2.join()
print("Отсчет завершен.")
Здесь функция count_down выполняет простой обратный отсчет чисел от заданного значения до 1. Первый считает от 5 до 1, второй считает от 3 до 1.

Как сделать многопоточность в Python?

Для создания и управления потоками в Python используется специальный модуль threading. Вместо того чтобы делать задачи по очереди, программа справляется с ними параллельно, экономя время.
Работа потоков в Python
Параллельное выполнение задач в потоках ​​
Чтобы создать поток, выполните следующие шаги:

  1. Определите функцию, которая будет выполнять задачу.
  2. Передайте эту функцию в класс Thread через параметр target.
  3. Если функция принимает аргументы, передайте их с помощью параметра args в виде кортежа.
  4. Запустите поток с помощью метода start().
  5. Дождитесь завершения с помощью метода join().

Пример:
import threading
def count_words(filename):
    """
    Считает количество слов в файле и выводит результат.
    """
    try:
        with open(filename, "r") as file:
            text = file.read()
        word_count = len(text.split())
        print(f"{filename}: {word_count} слов")
    except FileNotFoundError:
        print(f"{filename}: файл не найден")
# Создаем два потока для работы с разными файлами
thread1 = threading.Thread(target=count_words, args=("file1.txt",))
thread2 = threading.Thread(target=count_words, args=("file2.txt",))
# Запускаем потоки
thread1.start()
thread2.start()
# Ожидаем завершения 
thread1.join()
thread2.join()
print("Обработка файлов завершена.")

Синхронизация потоков

Когда несколько threads выполняются одновременно и обращаются к одной и той же части программы или общим данным, могут возникнуть ошибки. Представьте, что два человека пытаются одновременно писать на одной доске: их записи могут пересекаться, и результат будет неразборчивым. В программировании эта проблема называется «состояние гонки» (race condition).

Чтобы предотвратить такие ситуации, используется синхронизация потоков — метод, который управляет доступом потоков к общим ресурсам, чтобы они не мешали друг другу. В Python для этого используется специальный инструмент — Lock (замок), который предоставляет модуль threading.

Как это работает?

  • Представим, что общий ресурс — это комната, а потоки — люди, которые хотят войти.
  • Замок (Lock) закрывает дверь, чтобы только один человек мог войти в комнату за раз.
  • Другие потоки (люди) ждут за дверью, пока текущий поток не выйдет (замок откроется).

Что такое ThreadPoolExecutor и чем он поможет?

Это инструмент, который позволяет выполнять несколько задач одновременно с использованием пула threads. Вы создаете группу потоков (например, 3 или 5), и задачи распределяются между ними автоматически.
Схема работы ThreadPoolExecutor с пулом потоков и задачами
Потоки распределяют задачи через ThreadPoolExecutor
Например, у вас есть программа, которая скачивает 50 файлов из интернета. Если вы начнете скачивать их один за другим, это займет много времени. Но если вы скачаете сразу несколько файлов параллельно, то будет быстрее. Именно для таких задач и нужен ThreadPoolExecutor.

Пример использования:
from concurrent.futures import ThreadPoolExecutor
def process_file(file_name):
    print(f"Processing file: {file_name}")
# Создаем пул из 3 threads
with ThreadPoolExecutor(max_workers=3) as executor:
    files = ["file1.txt", "file2.txt", "file3.txt", "file4.txt"]
    executor.map(process_file, files)
Все файлы обрабатываются параллельно, ускоряя выполнение программы.

Что есть помимо потоков в Python?

Для решения задач параллельного выполнения Python предлагает не только потоки. Существуют и другие подходы, которые эффективно справляются с ограничениями многопоточности, помогая обрабатывать данные быстрее и проще.
Альтернативы многопоточности в Python
Сравнение Threading, Multiprocessing и Asyncio ​
  • Если в питон многопоточность ограничена GIL (глобальной блокировкой интерпретатора), используйте модуль multiprocessing, который создает независимые процессы и задействует все ядра процессора — это идеально для ресурсоемких вычислений.
  • Для задач с задержками (сетевые запросы или ввод-вывод), лучше подходит асинхронное программирование с asyncio, позволяющее выполнять множество операций параллельно.

Выводы

В этой статье мы разобрали, есть ли многопоточность в Python, как она работает, какие инструменты доступны, а также изучили примеры ее применения. Многопоточность в Python открывает широкие возможности для параллельного выполнения задач, но для полной оптимизации программ важно понимать ограничения GIL, уметь правильно синхронизировать потоки и выбирать подходящие инструменты.

Если вы хотите глубже разобраться в этой теме и освоить другие аспекты Python, обратите внимание на курс от ProductStar. Освойте востребованную профессию и начните зарабатывать в среднем 200 000 ₽ на удаленке. Преподаватели курса — опытные практики из «Яндекса», Ozon и Amazon.
Поделиться
star1

Вам может также понравиться

С гарантией результата: как найти хорошую работу после окончания IT-курсов
Плюсы и минусы онлайн-обучения
Программирование
Язык программирования Ruby: особенности, применение и перспективы
Программирование
Язык программирования Swift: возможности, применение и преимущества
star2

Курсы, которые выбирают чаще всего