TGViewer
Python/ django Python/ django @pythonl · 58.7K subscribers
Post #5310 7.65K
⚡️ Приём на Python под высокой нагрузкой: ограничивай конкуренцию сам, а не доверяй это ОС.

Вместо тысячи одновременных задач делай очередь + фиксированное число воркеров.

Так ты:

- не убиваешь БД/внешний сервис шторма́м запросов
- контролируешь задержки
- получаешь естественный backpressure

Пример для I/O-нагрузки (HTTP запросы) с asyncio:


import asyncio
import aiohttp
from time import perf_counter

URLS = [
"https://example.com"
for _ in range(10_000) # много запросов под нагрузкой
]

MAX_CONCURRENCY = 100 # ограничиваем параллелизм
QUEUE_SIZE = 1_000 # ограничиваем длину очереди (backpressure)


async def worker(name: int, queue: asyncio.Queue, session: aiohttp.ClientSession):
while True:
url = await queue.get()
if url is None: # сигнал завершения
queue.task_done()
break

try:
async with session.get(url, timeout=5) as resp:
await resp.text() # или resp.read()
# здесь твоя логика обработки
except Exception as e:
# логируй, но не падай
print(f"[worker {name}] error: {e}")

queue.task_done()


async def main():
queue = asyncio.Queue(maxsize=QUEUE_SIZE)

async with aiohttp.ClientSession() as session:
# поднимаем ограниченное число воркеров
workers = [
asyncio.create_task(worker(i, queue, session))
for i in range(MAX_CONCURRENCY)
]

# кидаем задачи в очередь
for url in URLS:
await queue.put(url)

# шлём сигнал завершения воркерам
for _ in workers:
await queue.put(None)

# ждём, пока всё отработает
await queue.join()

# аккуратно завершаем воркеров
for w in workers:
await w


if __name__ == "__main__":
t0 = perf_counter()
asyncio.run(main())
print(f"Done in {perf_counter() - t0:.2f}s")


Суть приёма:

Вместо «одна корутина на каждый запрос» ты держишь фиксированный пул воркеров.

Очередь с maxsize работает как предохранитель: если бэкенд/БД не успевают, продюсер начинает тормозиться.

Такой подход гораздо стабильнее под всплесками трафика, чем голый gather на десятки тысяч задач.


@pythonl
  • ❤ 16
  • 👍 9
  • 🔥 4
More from @pythonl
  1. Sep 28, 2026🚀 Jina-OCR-v1 разбирает целые страницы в Markdown со скоростью 2,57 страницы/с Jina AI пр…
  2. Sep 27, 2026🐍 В Python 3.15 решили мягко «похоронить» re.match() re.match() никуда не удаляют, но для…
  3. Sep 26, 2026⚡️ Qwen-Image за 6 шагов: Viggle ускорили генерацию и редактирование в 5 раз Viggle выложи…
  4. Sep 25, 2026🖥 Заголовки безопасности для FastAPI - одной строкой 🛡️ fastapi-security-headers добавля…
  5. Sep 24, 2026Линтер для инструкций ИИ-агентов LintLang проверяет AGENTS.md, CLAUDE.md, SKILL.md, описан…
  6. Sep 24, 2026‼️Ваши данные уже слиты. Вопрос лишь в том, кто и как ими воспользуется. Только в 2025 год…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →