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

22. Синхронизация остатков, которую нельзя остановить

Сложная

Kotlin · 36 строк

Продавец нажимает «Синхронизировать остатки» — сервис проходит по его SKU, от 200 до 20 000, читает остаток из учётной системы и отправляет в маркетплейс. Кнопки «Стоп» и повторный запуск вызываются из разных потоков веб-сервера.

Отметьте строки с ошибками.

В работе: Интеграция складского учёта продавца с маркетплейсом.

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

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

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. import kotlinx.coroutines.CoroutineScope
  2. import kotlinx.coroutines.Dispatchers
  3. import kotlinx.coroutines.Job
  4. import kotlinx.coroutines.launch
  5. class StockSync(
  6. private val api: MarketplaceApi,
  7. private val scope: CoroutineScope,
  8. ) {
  9. private var job: Job? = null
  10. // Продавец нажал «Синхронизировать остатки». Кнопку можно нажать повторно.
  11. fun start(skus: List<Long>) {
  12. job?.cancel()
  13. job = scope.launch(Dispatchers.IO) {
  14. for (sku in skus) {
  15. try {
  16. val qty = api.fetchStock(sku)
  17. api.pushStock(sku, qty)
  18. } catch (e: Exception) {
  19. println("sku $sku: ${e.message}")
  20. }
  21. Thread.sleep(50) // пауза между SKU, лимит API маркетплейса
  22. }
  23. }
  24. }
  25. fun stop() {
  26. job?.cancel()
  27. }
  28. }
  29. interface MarketplaceApi {
  30. suspend fun fetchStock(sku: Long): Int
  31. suspend fun pushStock(sku: Long, qty: Int)
  32. }