Skip to content

STUD-IT-team/python-dz1-2025

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Домашнее задание № 1 по Python

Работа с github

Для успешного выполнения домашних заданий вам потребуется:

  1. Создать персональную копию репозитория
    Выполните fork данного репозитория на своём аккаунте GitHub — это создаст независимую копию для вашей работы.

  2. Настроить правила:

    1. Перейдите в SettingsBranches вашего форка
    2. Добавьте правила для ветки main: Add classic branch protection rule
    3. Установите Branch name pattern = main
    4. Включите опции:
      • Require a pull request before merging
      • Require approvals
      • Require status checks to pass
      • Do not allow bypassing the above settings
  3. Добавьте ревьюера:

    1. Перейдите в SettingsCollaborators вашего форка
    2. В поле Add people введите логин GitHub вашего ментора и нажмите Add.
    3. Теперь этот человек будет иметь доступ к вашему форку и вы сможете назначать его ревьюером в PR, созданных внутри вашего форка.
  4. Настроить безопасное подключение
    Настройте SSH-ключ или получите токен аутентификации для безопасного доступа к репозиторию без ввода пароля.

  5. Склонировать репозиторий локально
    Используйте команду git clone для загрузки репозитория на ваш компьютер.

  6. Создать рабочую ветку
    На основе ветки main создайте новую ветку с произвольным названием для разработки решения.

  7. Создать go-модуль dz3
    go mod init dz3

  8. Реализовать решения задач
    В созданной ветке напишите код для задач, разместив решения и тестовые примеры в соответствии со структурой проекта, описанной ниже.

  9. Завершить и проверить решение
    После завершения разработки убедитесь, что:

    • Все тесты проходят успешно
    • CI/CD pipeline показывает положительный результат
    • Код соответствует требованиям
  10. Создать запрос на слияние
    Отправьте Pull Request для объединения вашей ветки с веткой main вашего репозитория (а не основного!).

  11. Получите одобрение ментора
    Напишите ментору в телеграмм и дождитесь его обратной связи (возможно придётся исправить!)

Важно: Сохраняйте соответствие структуре проекта и обеспечивайте прохождение всех автоматических проверок перед отправкой работы.

Гайд по созданию персональной копии репозитория и аутентификации есть здесь

Структура проекта

.
├── README.md
├── requirements.txt
├── src
│   ├── main.py
│   ├── manager
│   │   ├── manager.py
│   │   └── task.py
│   └── tasks
│       ├── abstract.py
│       ├── file.py
│       └── net.py
├── tests
│   ├── conftest.py
│   └── test_async_queue.py

Общие требования

Задача:

Реализовать асинхронную очередь задач, которая позволяет выполнять несколько задач параллельно с учётом приоритета и обработки ошибок. Каждая задача должна быть экземпляром класса, наследующего абстрактный класс Task. Реализовать существующих наследников Task, придумать и реализовать свою. Очередь должная работать с любыми наследниками Task, реализованными в соответствии с требованиями.

Контекст

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

Такие задачи обычно связаны не с вычислениями, а с ожиданием внешнего события (например, ответа сервера, чтения файла или записи в базу данных). Вместо того чтобы блокировать поток, программа может в это время выполнять другие задачи.

Самые частые примеры таких задач:

  • Чтение и запись файлов на диск (например, загрузка логов или отчётов);

  • Сетевые запросы к API (получение данных с веб-сервисов, REST-запросы);

  • Загрузка или скачивание файлов из интернета;

  • Обращение к базе данных через асинхронные драйверы (например, asyncpg, aiomysql);

  • Асинхронная отправка уведомлений или сообщений (например, в Telegram, Slack, RabbitMQ);

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

Описание

Необходимо реализовать систему из нескольких модулей:

  • Абстрактная задача Task

Определяет структуру и интерфейс любой задачи. Конкретные задачи должны наследоваться от этого класса.

Содержит:

- id: UUID — уникальный идентификатор задачи;

- priority: int — приоритет (0–100, чем выше, тем раньше выполняется);

- абстрактный метод execute(), выполняющий задачу.
  • Очередь AsyncTaskQueue

Поддерживает асинхронное выполнение задач с ограниченным числом воркеров в соответствии с заданным приоритетом. Воркер -- отдельная корутина, которая выполняет задачи из очереди.

  • Примеры конкретных задач:

    • FileReadTask: асинхронно читает файл с диска;

    • HttpDownloadTask: скачивает файл по URL;

    • Ваша собственная задача.

Требования к реализации

  • Все задачи должны быть асинхронными, т.е. они не должны блокировать цикл событий.

  • Все задачи должны иметь уникальный идентификатор.

  • Все задачи должны иметь приоритет от 0 до 100.

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

  • Очередь должна работать с любыми наследниками Task, реализованными в соответствии с требованиями.

  • Очередь должна корректно останавливаться, заканчивая выполнение всех задач и завешением воркеров.

Советы по реализации

  • Простейший способ реализовать приоритетную очередь -- список + bisect или heapq.

  • Для асинхронной работы с сетью лучше использовать aiohttp.

  • Для асинхронной работы с файлами лучше использовать aiofiles.

  • Для обеспечение безопасности и оповещения о выполнении чего-либо можно использовать примитивы синхронизации: https://docs.python.org/3/library/asyncio-sync.html

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages