Параллельный запуск задач с asyncio.Semaphore

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

pythonasynciosemaphore

👁 В автоматизации часто нужно дергать десятки или сотни внешних API. Если делать это без ограничений, то легко словить rate limit, баны или просто убить сеть. Последовательный запуск слишком медленный, а бесконтрольный параллелизм — путь к проблемам. Нужно ограничивать количество одновременных задач.

📝 Ограничение параллелизма при работе с API

import asyncio
import aiohttp

sem = asyncio.Semaphore(5)

async def fetch(session, url):
    async with sem:
        async with session.get(url) as resp:
            return await resp.text()

async def main():
    urls = ["https://example.com"] * 20
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        print(len(results))

asyncio.run(main())

📌 Как это работает:

  • Semaphore ограничивает количество одновременно выполняемых корутин (в примере — максимум 5).
  • Все запросы запускаются параллельно, но выполняются партиями, без перегрузки API.
  • Такой подход позволяет держать баланс между скоростью и стабильностью автоматизации.

❗️ В задачах автоматизации и парсинга контроль параллелизма — критичен. Без него даже простой скрипт может быстро превратиться в источник блокировок и нестабильной работы.

tags: #python #автоматизация #разработка

🧭 @recura_tech 🌐 VK 🌐 MAX

Скриншот: тёмная карточка с кодом на Python (asyncio, aiohttp), показан пример использования asyncio.Semaphore для ограничения параллелизма и логотип RECURA.
Пример кода: использование asyncio.Semaphore с aiohttp для запуска задач партиями и защиты от rate limit.

Читайте так же