Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: threading, multiprocessing, asyncio, concurrency, GIL

Какие способы распараллеливания задач существуют в Python?

Вопрос проверяет знание механизмов параллельного выполнения в Python, включая потоки, процессы и асинхронность, что важно для оптимизации производительности.

Короткий ответ

В Python есть три основных способа: threading (потоки) для I/O-bound задач, multiprocessing (процессы) для CPU-bound задач и asyncio (асинхронность) для высоконагруженных I/O операций. Из-за GIL потоки не дают прироста в CPU-задачах. Multiprocessing обходит GIL, создавая отдельные процессы. Asyncio использует кооперативную многозадачность в одном потоке.

Длинный ответ

Основные способы распараллеливания в Python

Python предлагает несколько подходов для параллельного выполнения кода, каждый из которых подходит для разных сценариев. Выбор зависит от типа задач: I/O-bound (ожидание ввода-вывода) или CPU-bound (вычисления).

Threading (потоки)

Модуль threading позволяет запускать несколько потоков в одном процессе. Из-за GIL (Global Interpreter Lock) только один поток может выполнять байт-код Python в любой момент времени. Поэтому threading эффективен только для I/O-bound задач, где потоки ждут ответа от сети или диска.

import threading
import time

def io_task(name):
    print(f"Task {name} started")
    time.sleep(1)  # имитация I/O
    print(f"Task {name} finished")

threads = []
for i in range(5):
    t = threading.Thread(target=io_task, args=(i,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

Multiprocessing (процессы)

Модуль multiprocessing создает отдельные процессы, каждый со своим GIL. Это позволяет использовать все ядра CPU для вычислений. Подходит для CPU-bound задач, но требует больше памяти и накладных расходов на межпроцессное взаимодействие.

from multiprocessing import Process

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

if __name__ == "__main__":
    processes = []
    for i in range(4):
        p = Process(target=cpu_task, args=(10**7,))
        processes.append(p)
        p.start()
    for p in processes:
        p.join()

Asyncio (асинхронность)

Asyncio использует кооперативную многозадачность в одном потоке с помощью корутин и event loop. Идеально для большого количества I/O операций (например, веб-скрапинг или работа с базами данных). Код пишется с ключевыми словами async/await.

import asyncio

async def fetch_data(url):
    print(f"Fetching {url}")
    await asyncio.sleep(1)  # имитация запроса
    return f"Data from {url}"

async def main():
    tasks = [fetch_data(f"http://example.com/{i}") for i in range(5)]
    results = await asyncio.gather(*tasks)
    print(results)

asyncio.run(main())

Вывод: Для I/O-bound задач используйте asyncio (если нужна высокая производительность) или threading (если проще). Для CPU-bound задач применяйте multiprocessing. Asyncio особенно полезен для веб-серверов и сетевых приложений, где тысячи соединений обрабатываются эффективно.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Python

    Python

  • Node.js

    Node.js

Ключевые слова

#threading

#multiprocessing

#asyncio

#concurrency

#GIL

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.