gerimovich_ilya_lab_2 is ready

This commit is contained in:
platoff aeeee
2025-12-13 18:47:19 +04:00
parent 312b184706
commit 6b676bd49f
8 changed files with 226 additions and 0 deletions

View File

@@ -0,0 +1,76 @@
# Лабораторная работа №2 Геримович И.М.
## Описание проекта
Данный проект представляет собой распределённое приложение, состоящее из двух микросервисов, которые последовательно обрабатывают данные.
Первое приложение анализирует набор файлов во входном каталоге, второе выполняет статистическую обработку над результатами первого.
## Варианты задач:
### Программа 1:
Формирует файл /var/result/data.txt так, что каждая строка файла - количество строк в файлах из каталога /var/data.
### Программа 2:
Ищет наибольшее число из файла /var/data/data.txt и сохраняет количество таких чисел из последовательности в /var/result/result.txt.
## Технологии
Python 3.11 - язык программирования
Docker - контейнеризация приложений
Docker Compose - оркестрация контейнеров
## Архитектура решения
┌───────────────────────────────────┐ ┌───────────────────────────────────┐
│ PROGRAM 1 │ │ PROGRAM 2 │
│ │ │ │
│ Сканирует каталог /var/data │ │ Читает файл data.txt │
│ Считает строки в каждом файле │──▶│ Находит максимальное число │
│ Выводит промежуточные данные: │ │ Подсчитывает частоту максимума │
│ • Файл X: N строк │ │ Сохраняет количество чисел │
│ • Итого обработано: M файлов │ │ Выводит результат в консоль │
│ Записывает data.txt │ │ │
└───────────────────────────────────┘ └───────────────────────────────────┘
## Как запустить лабораторную работу
Предварительные требования:
Установленный Docker
Установленный Docker Compose
docker compose up --build
### Остановка
docker compose down
# Работа программ:
## Program1
Сканирует каталог /var/data
Для каждого файла подсчитывает количество строк
Создает файл /var/result/data.txt, где каждая строка соответствует количеству строк в исходных файлах
Результат: файл с числами, представляющими количество строк в каждом файле входного каталога
## Program2
Читает файл /var/data/data.txt, созданный program1
Находит максимальное число в файле
Подсчитывает, сколько раз это максимальное число встречается в последовательности
Сохраняет результат (количество чисел) в файл /var/result/result.txt
Выводит результат
## Результат программы:
### Промежуточные + итоговые данные:
program1-1 | Файл file1.txt: 4 строк
program1-1 | Файл file2.txt: 9 строк
program1-1 | Файл file3.txt: 9 строк
program1-1 | Файл file4.txt: 5 строк
program1-1 | Программа 1 завершена. Обработано файлов: 4
program1-1 | Результат записан в: /var/result/data.txt
program1-1 exited with code 0
program2-1 | Наибольшее число: 9
program2-1 | Количество максимальных чисел в последовательности: 2
program2-1 | Результат сохранен в: /var/result/result.txt
program2-1 exited with code 0
## Видео
https://disk.yandex.ru/i/KoSG9k3q3MWfZg

View File

@@ -0,0 +1,26 @@
version: '3.8'
services:
program1:
build:
context: ./program1
volumes:
- ./test-data:/var/data
- ./program1-data:/var/result
networks:
- app-network
program2:
build:
context: ./program2
volumes:
- ./program1-data:/var/data
- ./results:/var/result
depends_on:
- program1
networks:
- app-network
networks:
app-network:
driver: bridge

View File

@@ -0,0 +1,16 @@
FROM python:3.11-slim
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем файлы приложения
COPY app.py .
COPY requirements.txt .
# Устанавливаем зависимости
RUN pip install --no-cache-dir -r requirements.txt
# Создаем необходимые директории для монтирования
RUN mkdir -p /var/data /var/result
CMD ["python", "app.py"]

View File

@@ -0,0 +1,40 @@
import os
def main():
input_dir = "/var/data"
output_file = "/var/result/data.txt"
# Создаем директорию для результатов, если её нет
os.makedirs(os.path.dirname(output_file), exist_ok=True)
try:
# Получаем список файлов в директории
files = [f for f in os.listdir(input_dir)
if os.path.isfile(os.path.join(input_dir, f))]
line_counts = []
# Для каждого файла считаем количество строк
for filename in files:
filepath = os.path.join(input_dir, filename)
try:
with open(filepath, 'r', encoding='utf-8') as f:
line_count = sum(1 for _ in f)
line_counts.append(str(line_count))
print(f"Файл {filename}: {line_count} строк")
except Exception as e:
print(f"Ошибка при обработке файла {filename}: {e}")
# Записываем результаты в файл
with open(output_file, 'w', encoding='utf-8') as f:
f.write('\n'.join(line_counts))
print(f"Программа 1 завершена. Обработано файлов: {len(files)}")
print(f"Результат записан в: {output_file}")
except Exception as e:
print(f"Критическая ошибка: {e}")
raise
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,16 @@
FROM python:3.11-slim
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем файлы приложения
COPY app.py .
COPY requirements.txt .
# Устанавливаем зависимости
RUN pip install --no-cache-dir -r requirements.txt
# Создаем необходимые директории
RUN mkdir -p /var/data /var/result
CMD ["python", "app.py"]

View File

@@ -0,0 +1,52 @@
import os
def main():
input_file = "/var/data/data.txt"
output_file = "/var/result/result.txt"
# Создаем директорию для результатов, если её нет
os.makedirs(os.path.dirname(output_file), exist_ok=True)
try:
# Читаем данные из файла
numbers = []
if os.path.exists(input_file):
with open(input_file, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if line: # Пропускаем пустые строки
try:
numbers.append(int(line))
except ValueError:
print(f"Предупреждение: некорректное число '{line}' пропущено")
if not numbers:
print("Файл data.txt пуст или содержит только некорректные данные")
max_number = 0
count = 0
else:
# Находим максимальное число
max_number = max(numbers)
# Считаем, сколько раз оно встречается
count = numbers.count(max_number)
print(f"Наибольшее число: {max_number}")
print(f"Количество максимальных чисел в последовательности: {count}")
# Сохраняем результат
with open(output_file, 'w', encoding='utf-8') as f:
f.write(str(count))
print(f"Результат сохранен в: {output_file}")
except Exception as e:
print(f"Критическая ошибка: {e}")
raise
except FileNotFoundError:
print(f"Ошибка: Файл {input_file} не найден")
except ValueError as e:
print(f"Ошибка: Неверный формат данных в файле - {e}")
if __name__ == "__main__":
main()