Назад к вопросам
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 задачи (вычисления)