Назад к вопросам
Junior
67
questionbank

Что такое параллелизм?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Параллелизм - это способность системы выполнять несколько задач или процессов одновременно. В отличие от конкурентности, где задачи могут переключаться, создавая иллюзию одновременности (например, на одноядерном процессоре), параллелизм требует наличия нескольких физических ресурсов (например, ядер процессора).

Основные виды параллелизма:

  • На уровне битов: Увеличение размера машинного слова (например, переход от 32-битных процессоров к 64-битным).
  • На уровне инструкций: Исполнение нескольких инструкций в одном такте (например, конвейеризация, суперскалярная архитектура).
  • На уровне данных: Применение одной операции к множеству элементов данных одновременно (например, SIMD-инструкции).
  • На уровне задач (или потоков/процессов): Выполнение независимых блоков кода (задач) на нескольких ядрах или процессорах.

В контексте Python реализация параллелизма на уровне задач осуществляется преимущественно двумя способами:

  1. Многопроцессность (multiprocessing): Создание независимых процессов, каждый со своим собственным адресным пространством и интерпретатором Python. Обмен данными между процессами требует явных механизмов (очереди, каналы, общая память). Это позволяет обойти ограничение Global Interpreter Lock (GIL) и использовать множество ядер CPU для ресурсоемких задач.
    // Пример использования multiprocessing
    import multiprocessing
    
    def worker(num):
        """Функция, выполняющая работу в отдельном процессе"""
        print(f'Worker {num} starting')
        import time
        time.sleep(1)
        print(f'Worker {num} finishing')
    
    if __name__ == '__main__':
        processes = []
        for i in range(3):
            p = multiprocessing.Process(target=worker, args=(i,))
            processes.append(p)
            p.start()
    
        for p in processes:
            p.join() // Ожидание завершения процесса
    
        print('All processes finished')
    
    
  2. Многопоточность (threading): Создание потоков внутри одного процесса. Потоки имеют общее адресное пространство, что облегчает обмен данными, но ограничены GIL в cPython, который не позволяет одновременно выполнять Python-код множества потоков на разных ядрах. Многопоточность полезна для задач ввода-вывода (сеть, дисковые операции), где потоки могут переключаться, пока один из них ожидает.
    // Пример использования threading
    import threading
    
    def worker(num):
        """Функция, выполняющая работу в отдельном потоке"""
        print(f'Thread {num} starting')
        import time
        time.sleep(1)
        print(f'Thread {num} finishing')
    
    threads = []
    for i in range(3):
        t = threading.Thread(target=worker, args=(i,))
        threads.append(t)
        t.start()
    
    for t in threads:
        t.join() // Ожидание завершения потока
    
    print('All threads finished')
    
    

Выбор между многопроцессностью и многопоточностью зависит от типа задачи: многопроцессность предпочтительна для CPU-связанных задач, многопоточность - для I/O-связанных.

Различия:

Признак Многопроцессность (multiprocessing) Многопоточность (threading)
Ресурс Отдельный процесс Поток внутри процесса
Адресное пространство Своё Общее
Обмен данными Сложный (требует явных механизмов) Простой (общее пространство)
GIL Обходит (каждый процесс имеет свой GIL) Ограничивает (общий GIL на процесс)
Использование CPU Эффективно для CPU-bound задач Неэффективно для CPU-bound задач
Создание Дорогое (форк процесса) Дешевое
Завершение ОС завершает Явное завершение или выход из функции
Ошибки Не влияют на другие процессы Могут повлиять на весь процесс