⚡️ Приём на Python под высокой нагрузкой: ограничивай конкуренцию…

Загружаем изображение…
⚡️ Приём на 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(.runmain())
    print(f"Done in {perf_counter() - t0:.2f}s")
Суть приёма:
Вместо «одна корутина на каждый запрос» ты держишь фиксированный пул воркеров.
Очередь с maxsize работает как предохранитель: если бэкенд/БД не успевают, продюсер начинает тормозиться.
Такой подход гораздо стабильнее под всплесками трафика, чем голый gather на десятки тысяч задач.
Просмотры: 2 773
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти