import asyncio import logging import time from typing import TYPE_CHECKING from sender.base import BaseStocksSender, SendStockStatus if TYPE_CHECKING: from updaters.base import BaseMarketplaceUpdater class YandexmarketStocksSender(BaseStocksSender): def __init__(self, updater: "BaseMarketplaceUpdater"): super().__init__(updater) self.start_time = time.time() self.total_stocks_sent = 0 @property def max_retries(self) -> int: return 5 @property def chunk_size(self) -> int: return 2000 async def _process_chunk(self, chunk: list[dict]) -> SendStockStatus: session, response = await self.api.update_stocks(chunk) try: status_code = response.status if status_code == 200: self.total_stocks_sent += len(chunk) return SendStockStatus.SUCCESS if status_code == 420: time_to_sleep = 60 - (time.time() - self.start_time) await asyncio.sleep(time_to_sleep) return SendStockStatus.SHOULD_RETRY response_text = await response.text() logging.error(f'[{self.updater.marketplace.id}]: {response_text}') return SendStockStatus.ERROR finally: await session.close() async def after_chunk_processed(self): time_delta = time.time() - self.start_time if self.total_stocks_sent >= 100_000 and time_delta < 60: time_to_sleep = 60 - time_delta await asyncio.sleep(time_to_sleep) self.start_time = time.time() self.total_stocks_sent = 0 async def before_chunk_processed(self): pass