Вопрос №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-задач: обработка данных, вычисления, алгоритмы.
