Назад к вопросам
Junior
79
questionbank

Что такое параллелизм в программировании?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Параллелизм в программировании — это выполнение нескольких задач одновременно или кажущееся одновременным, что позволяет повысить производительность и отзывчивость приложений.

Различают несколько видов параллелизма:

  • Многопроцессность (Multiprocessing): Использует несколько независимых процессов, каждый со своим адресным пространством. Это обходит ограничение GIL (Global Interpreter Lock) в CPython и подходит для задач, интенсивно использующих CPU.

    import multiprocessing
    import time
    
    def worker(num):
        """Некая работа"""
        time.sleep(1)
        print(f'Worker {num} finished')
    
    if __name__ == '__main__':
        processes = []
        for i in range(5):
            p = multiprocessing.Process(target=worker, args=(i,))
            processes.append(p)
            p.start()
    
        for p in processes:
            p.join()
        print("All workers finished")
    
  • Многопоточность (Multithreading): Использует несколько потоков в рамках одного процесса, разделяющих общее адресное пространство. Из-за GIL в CPython, потоки не выполняются параллельно на разных ядрах для CPU-bound задач, но эффективны для I/O-bound задач.

    import threading
    import time
    
    def worker(num):
        """Некая работа"""
        time.sleep(1) # Имитация I/O операции
        print(f'Thread {num} finished')
    
    threads = []
    for i in range(5):
        t = threading.Thread(target=worker, args=(i,))
        threads.append(t)
        t.start()
    
    for t in threads:
        t.join()
    print("All threads finished")
    
  • Асинхронное программирование (Asyncio): Использует один поток и цикл событий (event loop) для управления выполнением задач. Подходит для высоконагруженных I/O-bound приложений и веб-серверов. Не блокирует выполнение при ожидании I/O.

    import asyncio
    import time
    
    async def worker(num):
        """Некая асинхронная работа"""
        await asyncio.sleep(1) # Асинхронное ожидание I/O
        print(f'Async worker {num} finished')
    
    async def main():
        tasks = []
        for i in range(5):
            task = asyncio.create_task(worker(i))
            tasks.append(task)
        await asyncio.gather(*tasks)
        print("All async workers finished")
    
    if __name__ == '__main__':
        asyncio.run(main())
    

Выбор подхода зависит от характера задачи:

Подход CPU-bound задачи I/O-bound задачи GIL Использование памяти
Многопроцессность Отлично Хорошо Обходит Большое (свой процесс)
Многопоточность Плохо (из-за GIL) Отлично Блокирует Небольшое (общий процесс)
Асинхронность Плохо Отлично Не блокирует Небольшое (один поток)

Параллелизм требует осторожного управления синхронизацией и ресурсами, чтобы избежать состояний гонки (race conditions) и взаимоблокировок (deadlocks).