Для чего используется многопоточность (multithreading) в Python?

«Для чего используется многопоточность (multithreading) в Python?» — вопрос из категории Other, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Пример для I/O-bound задач (потоки):

import threading
import time

def io_task(task_id):
    print(f"Задача {task_id}: начало ожидания I/O")
    time.sleep(2)  # Имитация I/O-операции
    print(f"Задача {task_id}: завершена")

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

for t in threads:
    t.join()
print("Все I/O-задачи завершены.")

Пример для CPU-bound задач (процессы):

from multiprocessing import Process
import math

def cpu_task(n):
    result = sum(math.sqrt(i) for i in range(n))
    print(f"Вычисление завершено, результат: {result:.2f}")

if __name__ == '__main__':
    p = Process(target=cpu_task, args=(1_000_000,))
    p.start()
    p.join()

Ключевые выводы:

  • Потоки (threading) — для операций, связанных с ожиданием (I/O).
  • Процессы (multiprocessing) — для параллельных вычислений (CPU).
  • GIL ограничивает выполнение только одного потока Python одновременно, поэтому потоки не ускоряют CPU-bound код.