← Назад к вопросам
На какие категории по типу нагрузки можно разделить задачи?
1.6 Junior🔥 121 комментариев
#Асинхронность и многопоточность#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Категории задач по типу нагрузки
Все задачи в программировании можно разделить на две основные категории в зависимости от того, что является узким местом (bottleneck): CPU или I/O. От этого разделения зависит, какой подход к оптимизации и параллелизму использовать.
CPU-bound задачи (вычислительные)
Это задачи, которые требуют интенсивных вычислений и активного использования процессора.
import time
import math
from multiprocessing import Pool
def compute_primes(n):
primes = []
for num in range(2, n):
is_prime = True
for i in range(2, int(math.sqrt(num)) + 1):
if num % i == 0:
is_prime = False
break
if is_prime:
primes.append(num)
return len(primes)
start = time.time()
for i in range(10):
compute_primes(100000)
print(f"Синхронно: {time.time() - start:.2f}s")
start = time.time()
with Pool(processes=4) as pool:
pool.map(compute_primes, [100000] * 10)
print(f"Multiprocessing: {time.time() - start:.2f}s")
Характеристики CPU-bound:
- Узкое место — процессор
- Потоки не помогают (GIL в Python)
- Нужна многопроцессность
- Пример: обработка данных, ML, криптография
I/O-bound задачи (ввод-вывод)
Это задачи, которые ждут внешних ресурсов: сеть, файловую систему, БД.
import requests
import asyncio
import aiohttp
from concurrent.futures import ThreadPoolExecutor
def fetch_url(url):
response = requests.get(url)
return len(response.content)
start = time.time()
for i in range(10):
fetch_url(f"https://httpbin.org/delay/1")
print(f"Синхронно: {time.time() - start:.2f}s")
start = time.time()
with ThreadPoolExecutor(max_workers=5) as executor:
list(executor.map(fetch_url, ["https://httpbin.org/delay/1"] * 10))
print(f"Многопоточность: {time.time() - start:.2f}s")
async def fetch_url_async(session, url):
async with session.get(url) as response:
return len(await response.read())
async def main():
async with aiohttp.ClientSession() as session:
tasks = [fetch_url_async(session, "https://httpbin.org/delay/1") for _ in range(10)]
await asyncio.gather(*tasks)
Характеристики I/O-bound:
- Узкое место — ввод-вывод
- Многопоточность работает отлично
- Асинхронность еще эффективнее
- Пример: веб-скрапинг, API запросы, работа с БД
Смешанные задачи
Некоторые задачи содержат как CPU-bound, так и I/O-bound операции. Для них нужен гибридный подход.
Сравнительная таблица
| Характеристика | CPU-bound | I/O-bound |
|---|---|---|
| Узкое место | Процессор | Сеть/Диск/БД |
| Multithreading | Нет (GIL) | Да |
| Asyncio | Нет | Отлично |
| Multiprocessing | Отлично | Нет смысла |
| Примеры | ML, обработка | API, БД |
Рекомендации
- Определи узкое место: CPU или I/O?
- Для CPU-bound: используй multiprocessing или Cython
- Для I/O-bound: используй threading или asyncio
- Для смешанных: комбинируй подходы
- Измеряй: используй profiling перед оптимизацией
Молодые разработчики часто переусложняют, добавляя асинхронность везде. Помните: если операция CPU-bound, асинхронность не поможет.