Ответ
Многопоточность в 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 код.