Войти Регистрация
Конкурентность

33. Проверка статусов 500 ПВЗ Wildberries на asyncio

Лёгкая

Python · 32 строк

Раз в 5 минут сервис проверяет 500 ПВЗ своего региона: открыт ли пункт, сколько ячеек свободно. Один запрос к API статусов — около 200 мс, при перегрузке API отвечает 429.

В том же цикле событий живёт HTTP-хендлер /health. Оркестратор перезапускает под, если тот не отвечает 10 секунд. Отметьте строки с ошибками.

В работе: Фоновый сервис мониторинга пунктов выдачи.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 2 вопроса про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
asyncioблокировка event looprequeststime.sleep

Источник: наша задача на данных Wildberries: пункты выдачи заказов. Условие пересказано своими словами.

  1. import asyncio
  2. import time
  3. import requests
  4. STATUS_URL = "https://pvz-api.internal/v1/points/{}/status"
  5. async def check_point(point_id: int) -> dict:
  6. for attempt in range(3):
  7. resp = requests.get(STATUS_URL.format(point_id), timeout=5)
  8. if resp.status_code != 429:
  9. return resp.json()
  10. time.sleep(1)
  11. raise RuntimeError(f"ПВЗ {point_id}: 429 три раза подряд")
  12. async def check_all(point_ids: list[int]) -> list[dict]:
  13. results = []
  14. for pid in point_ids:
  15. results.append(await check_point(pid))
  16. return results
  17. async def main():
  18. ids = list(range(1, 501))
  19. statuses = await check_all(ids)
  20. print(len(statuses))
  21. if __name__ == "__main__":
  22. asyncio.run(main())