Menu

Tree [445cff] default tip /
 History

Read Only access


File Date Author Commit
 .idea 2024-12-11 Maksim Grishkin Maksim Grishkin [17687c] fix: Исправлена опечатка в слове Consumer
 gmafffff.training.producerConsumer 2024-12-12 Maksim Grishkin Maksim Grishkin [12d39e] feat: Подготовлен запуск приложения
 .hgignore 2024-12-10 Maksim Grishkin Maksim Grishkin [c46c2e] chore: Создан проект
 gmafffff.training.producerConsumer.sln 2024-12-11 Maksim Grishkin Maksim Grishkin [17687c] fix: Исправлена опечатка в слове Consumer
 gmafffff.training.producerConsumer.sln.DotSettings 2024-12-11 Maksim Grishkin Maksim Grishkin [17687c] fix: Исправлена опечатка в слове Consumer
 readme.md 2024-12-12 Maksim Grishkin Maksim Grishkin [445cff] docs: Исправление стиля

Read Me

Многопоточная модель производитель-потребитель (C#)

Тестовое задание для собеседования

Учет времени

На решение задачи мне потребовалось 😓:

задача время, час
Вникнуть в ТЗ 0.5
Создать проект 0.5
Настроить хост 0.8
Создать модель 14.6
Проверка 1.0
Рефакторинг 0.8
Документация 0.3

Всего: 18.5 часов.

Допущения, неоговоренные в ТЗ

Переполненный склад не принимает товар с завода.

Уровень складских запасов не должен падать ниже 95%.

Вместимость грузовика типа 1 — n·4 единиц, типа 2 - 1.1·n·4 и т.д.

Грузовиков столько же сколько и заводов.

Замечания к коду

В реальной жизни для решения подобной задачи скорее всего можно использовать akka.net — это избавит код от
низкоуровневых деталей многопоточности.

Инструкция для запуска

Приложение не требует дополнительных телодвижений и может быть собрано и запущено в IDE.

После запуска приложение выполнит длинный ряд подготовительных шагов для перехода к полнофункциональной симуляции.
Потом управление будет передано пользователю в CLI.

Протокол исполнения сохраняется в логе в папке со сборкой.

Сборка проекта сохраняется в каталоге %temp%\gmafffff\training\producerConsumer\

Приемы, с которыми можно познакомиться, изучая проект

  1. Консольное приложение
    внутри хоста, включая:
    • Внедрение зависимостей (DI);
    • Журналирование (log);
    • Конфигурация;
    • Завершение работы приложения.
  2. Логирование в файл и на консоль с помощью Serilog и его настройка через файл конфигурации и
    код.
  3. Исключить замусоривание папки проекта промежуточными файлами с помощью файла Directory.Build.props и параметра
    BaseOutputPath в .csproj.
  4. Использование соглашения о комитах
  5. Примитивы синхронизации: Pulse/Wait, lock, Interlocked; потокобезопасные коллекции, параллельное выполнение.

Оригинальное задание

Есть несколько заводов, каждый из которых выпускает продукцию одного типа. Например, завод A выпускает продукт "a",
завод B - продукт "b" и т.д. Каждый завод выпускает разное количество своей продукции. Завод А - n единиц в час, B - 1.1
·n единиц в 1 час, С - 1.2·n единиц продукции в час и т.д. Размерами продукции пренебрегаем и предполагаем одинаковыми
для всех фабрик, однако каждый продукт имеет уникальные свойства: название, вес, тип упаковки.

Необходимо организовать эффективное складирование продукции заводов, а так же доставку в торговые сети из расчёта, что
склад может вмещать M · (сумму продукции всех фабрик в час). По заполнению склада не менее чем на 95% склад должен
начинать освобождаться от продукции следующим образом. Продукцию со склада забирает грузовой транспорт различной
вместимости (не менее двух видов грузовиков). Грузовик может забирать продукцию разных типов.

М может быть переменным, но не менее 100. Число заводов может быть переменным, но не менее трёх. n может быть
переменным, но не менее 50

Необходимо вывести следующие результаты работы алгоритма:

  • последовательность поступления продукции на склад (фабрика, продукт, число единиц)
  • необходимо подсчитать статистику, сколько продукции и какого состава в среднем перевозят грузовики.

Приложение предлагается реализовать многопоточным.

Лицензия

Публичная собственность

MongoDB Logo MongoDB