56 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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:
 | 
						|
            async with response:
 | 
						|
                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
 |