Назад к вопросам
Junior
113
questionbank
Что такое многопоточность и многопроцессорность?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
- Многопоточность (Multithreading): Выполняет несколько потоков в одном процессе, разделяя общую память. Потоки переключаются (контекст прерывается и возобновляется) интерпретатором, что позволяет создавать иллюзию параллельного выполнения, но из-за GIL в Python истинное параллельное выполнение CPU-bound задач невозможно на многоядерных процессорах. Идеально подходит для I/O-bound задач (сетевые запросы, операции с файлами) благодаря неблокирующему поведению при ожидании ввода/вывода.
# Пример: использование потоков для одновременного скачивания данных
import threading
import requests
def download_url(url):
response = requests.get(url)
print(f"Downloaded from {url}: {len(response.content)} bytes")
urls = [
"https://www.google.com",
"https://www.bing.com",
"https://www.yahoo.com"
]
threads = []
for url in urls:
thread = threading.Thread(target=download_url, args=(url,))
threads.append(thread)
thread.start() # Запуск потока
for thread in threads:
thread.join() # Ожидание завершения потока
# Вывод будет примерно таким (порядок может отличаться)
# Downloaded from https://www.google.com: 15379 bytes
# Downloaded from https://www.bing.com: 12345 bytes
# Downloaded from https://www.yahoo.com: 6789 bytes
- Многопроцессорность (Multiprocessing): Выполняет несколько процессов, каждый с собственным адресным пространством памяти. Каждый процесс работает независимо и может использовать одно или несколько ядер процессора, преодолевая ограничение GIL. Идеально подходит для CPU-bound задач (вычисления, обработка данных), где важна истинная параллельность. Коммуникация между процессами сложнее, чем между потоками (используются Pipes, Queues).
# Пример: использование процессов для параллельных вычислений
import multiprocessing
import time
def calculate_square(number):
time.sleep(1) # Имитация длительной операции
result = number * number
print(f"Square of {number} is {result}")
numbers = [1, 2, 3, 4, 5]
# Создание пула процессов
with multiprocessing.Pool(processes=3) as pool:
# Применение функции к элементам списка параллельно
pool.map(calculate_square, numbers)
# Вывод может быть в разном порядке в зависимости от планировщика процессов
# Square of 1 is 1
# Square of 2 is 4
# Square of 3 is 9
# ... и т.д.
| Характеристика | Многопоточность (Multithreading) | Многопроцессорность (Multiprocessing) |
|---|---|---|
| GIL (Global Interpreter Lock) | Ограничивает истинное параллельное выполнение CPU-bound задач | Обходит GIL, каждый процесс имеет свой интерпретатор |
| Использование ЦПУ | Не эффективно для CPU-bound задач | Отлично для CPU-bound задач |
| Использование памяти | Потоки разделяют память одного процесса | Каждый процесс имеет свое адресное пространство |
| Создание/Уничтожение | Быстрее и дешевле | Медленнее и дороже |
| Коммуникация | Проще (общая память) | Сложнее (IPC - Inter-Process Communication) |
| Изоляция ошибок | Ошибка в одном потоке может повлиять на весь процесс | Ошибка в одном процессе не влияет на другие |
| Применение | I/O-bound задачи (ввод-вывод, сеть) | CPU-bound задачи (вычисления) |