Вопрос40
Осталось:

Чем отличается многопоточность от многопроцессности в Python?

Образцовый ответ

Показывать ответ по умолчанию

Многопоточность:

Потоки работают в одном процессе и разделяют общую память:

import threading

def download(url):
    print(f"Скачиваю {url}")

threads = []
for url in ["url1", "url2", "url3"]:
    t = threading.Thread(target=download, args=(url,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()  # Ожидание завершения всех потоков

Многопроцессность:

Каждый процесс имеет собственную память и собственный интерпретатор:

from multiprocessing import Process

def heavy_computation(n):
    return sum(i * i for i in range(n))

processes = []
for n in [10_000_000, 20_000_000]:
    p = Process(target=heavy_computation, args=(n,))
    processes.append(p)
    p.start()

for p in processes:
    p.join()

GIL (Global Interpreter Lock):

GIL — это механизм в CPython, который позволяет только одному потоку выполнять Python-код одновременно. Из-за этого:

  • Потоки не ускоряют задачи с интенсивными вычислениями (CPU-bound).
  • Потоки ускоряют задачи с ожиданием ввода-вывода (I/O-bound): сетевые запросы, чтение файлов.

Когда что использовать:

  • threading — для I/O-задач: скачивание файлов, API-запросы, работа с БД.
  • multiprocessing — для CPU-задач: обработка данных, вычисления, алгоритмы.
Критерийthreadingmultiprocessing
ПамятьОбщаяРаздельная
GILОграничиваетНе влияет
Накладные расходыНизкиеВысокие
Лучше дляI/O-boundCPU-bound