В чем заключается разница между параллельностью и конкурентностью в программировании?

Ответ

Хотя эти термины часто путают, они описывают разные подходы к выполнению задач.

Конкурентность (Concurrency) — это способность системы управлять несколькими задачами в один и тот же период времени, переключаясь между ними. Задачи могут выполняться поочередно на одном ядре процессора, создавая иллюзию одновременности.

  • Цель: Структурировать код для решения нескольких задач одновременно (например, обработка сетевых запросов и обновление UI).
  • Суть: Работа с множеством задач.

Параллельность (Parallelism) — это фактическое одновременное выполнение нескольких задач или частей одной задачи на разных физических ядрах процессора или на разных процессорах.

  • Цель: Ускорить вычисления за счет распараллеливания.
  • Суть: Одновременное выполнение множества задач.

Аналогия:

  • Конкурентность: Один бариста готовит эспрессо и одновременно взбивает молоко для капучино. Он быстро переключается между двумя задачами, но в каждый конкретный момент делает что-то одно.
  • Параллельность: Два бариста работают одновременно, каждый на своей кофемашине. Две задачи выполняются в одно и то же время.

Пример в Python:

import threading
import multiprocessing
import time

def cpu_bound_task():
    # Задача, интенсивно использующая процессор
    count = 0
    for i in range(10**7):
        count += i

# Конкурентность: потоки выполняются на одном ядре из-за GIL.
# Общее время будет примерно равно последовательному выполнению.
t1 = threading.Thread(target=cpu_bound_task)
t2 = threading.Thread(target=cpu_bound_task)
t1.start()
t2.start()
t1.join()
t2.join()

# Параллельность: процессы используют разные ядра CPU.
# Общее время выполнения будет значительно меньше.
p1 = multiprocessing.Process(target=cpu_bound_task)
p2 = multiprocessing.Process(target=cpu_bound_task)
p1.start()
p2.start()
p1.join()
p2.join()