/
temaptz
/
building-material-scout
Обзор
Документация
Войти
/
temaptz
/
building-material-scout
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/parallel.py
37 строк
2 KB
Artem Urvanov
dev
11 авг 2026, 10:59
11 авг 2026, 10:59
d62addb
Код
Авторство
О чём код?
import asyncio from typing import Callable, Awaitable from logger import get_logger logger = get_logger(__name__) async def process_queue( items: list[str], action: Callable[[str], Awaitable[None]], concurrent: int = 5 ) -> list: """ Асинхронно обрабатывает список элементов, применяя к каждому функцию action. Одновременно выполняется не более concurrent вызовов. :param items: список строк для обработки :param action: асинхронная функция :param concurrent: максимальное количество одновременных задач """ # Семафор ограничивает количество параллельных вызовов semaphore = asyncio.Semaphore(concurrent) async def bounded_action(item: str) -> None: """Обёртка, обеспечивающая ограничение параллелизма.""" async with semaphore: try: return await action(item) except Exception as e: logger.exception(f'Error processing item: {item}, {e}') return None # Создаём задачи для всех элементов tasks = [asyncio.create_task(bounded_action(item)) for item in items] # Ждём завершения всех задач. Исключения пробрасываются наверх. return await asyncio.gather(*tasks)