Skip to content

Commit 21b4ed3

Browse files
authored
Initial commit
0 parents  commit 21b4ed3

File tree

7 files changed

+128
-0
lines changed

7 files changed

+128
-0
lines changed

.github/workflows/app-testing.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: build-and-test
2+
3+
on:
4+
push:
5+
branches: [ main ]
6+
pull_request:
7+
branches: [ main ]
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
strategy:
13+
matrix:
14+
python-version: ["3.9", "3.10", "3.11"]
15+
steps:
16+
- uses: actions/checkout@v3
17+
- name: Set up Python ${{ matrix.python-version }}
18+
uses: actions/setup-python@v3
19+
with:
20+
python-version: ${{ matrix.python-version }}
21+
- name: Install dependencies
22+
run: |
23+
python -m pip install --upgrade pip
24+
pip install flake8 pytest
25+
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
26+
- name: Lint with flake8
27+
run: |
28+
# stop the build if there are Python syntax errors or undefined names
29+
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
30+
# exit-zero treats all errors as warnings
31+
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=119 --statistics --config=setup.cfg

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
.idea/
3+
__pycache__/
4+
*.pyc

README.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Проектное задание второго спринта
2+
3+
Спроектировать и реализовать планировщик задач для выполнения поступающих задач.
4+
5+
## Описание задания
6+
7+
**1. Описать реализацию класса `Scheduler`.**
8+
9+
Условия и требования:
10+
- Планировщик одновременно может выполнять до 10 задач (дефолтное значение, может быть изменено).
11+
- Возможность добавить задачу в планировщик и запустить её в рамках ограничений планировщика и настроек, указанных в задаче.
12+
- При штатном завершении работы планировщик сохраняет статус выполняемых и ожидающих задач.
13+
- После рестарта восстанавливается последнее состояние и задачи продолжают выполняться.
14+
15+
**2. Описать реализацию класса `Job`.**
16+
17+
Условия и требования:
18+
- У задачи может быть указана длительность выполнения (опциональный параметр). Если параметр указан, то задача прекращает выполняться, если время выполнения превысило указанный параметр.
19+
- У задачи может быть указано время запуска (опциональный параметр). Если параметр указан, то задача стартует в указанный временной период.
20+
- У задачи может быть указан параметр количества рестартов (опциональный параметр). Если в ходе выполнения задачи произошёл сбой или задачи-зависимости не были выполнены, то задача будет перезапущена указанное количество раз. Если параметр не указан, то количество рестартов равно 0.
21+
- У задачи может быть указаны зависимости — задача или задачи, от которых зависит её выполнение (опциональный параметр). Если параметр указан, то задача не может стартовать до момента, пока не будут завершены задачи-зависимости.
22+
23+
24+
**3. Проверить работу планировщика на различных задачах.**
25+
26+
Условия и требования:
27+
- работа с файловой системой: создание, удаление, изменение директорий и файлов;
28+
- работа с файлами: создание, чтение, запись;
29+
- работа с сетью: обработка ссылок (GET-запросы) и анализ полученного результата;
30+
- описать конвеер выполнения основной задачи минимум из 3 задач, зависящих друг от друга и выполняющихся последовательно друг за другом.
31+
32+
## Требования к решению
33+
34+
1. Используйте корутины и генераторы, изученные в теоретической части.
35+
2. Использование потоков и процессов не запрещено.
36+
3. Использование `asyncio` запрещено.
37+
4. Используйте встроенные библиотеки и модули языка.
38+
5. Используйте концепции ООП.
39+
6. Используйте аннотацию типов.
40+
7. Логируйте результаты действий.
41+
8. Предусмотрите обработку исключительных ситуаций.
42+
9. Приведите стиль кода в соответствие pep8, flake8, mypy.
43+
44+
## Рекомендации к решению
45+
46+
1. Покройте написанный код тестами.
47+
2. Для хранения статуса задач или планировщика используйте `.lock`-файлы и иные текстовые форматы — например, `txt` или `json`.
48+
3. Организуйте структуру хранения задач и/или их зависимостей в рамках отдельных директорий с определенным наименованием, используя `uid` или кастомный шаблон. Использование ссылок (`symlink`) не запрещено.
49+
4. Сигнатура описания классов может быть изменена под ваше усмотрение. Создавать дополнительные классы не запрещено.
50+
5. Используйте примитивы синхронизации, например, [Timer](https://docs.python.org/3/library/threading.html#timer-objects) или [Condition](https://docs.python.org/3/library/threading.html#condition-objects).
51+
6. По возможности, решение должно полностью строиться на использовании корутин.
52+
53+
Схематично сервис представлен на [диаграмме](schema.png){target="_blank"}.
54+
![image](schema.png)

job.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Job:
2+
def __init__(self, start_at="", max_working_time=-1, tries=0, dependencies=[]):
3+
pass
4+
5+
def run(self):
6+
pass
7+
8+
def pause(self):
9+
pass
10+
11+
def stop(self):
12+
pass

scheduler.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Scheduler:
2+
def __init__(self, pool_size=10):
3+
pass
4+
5+
def schedule(self, task):
6+
pass
7+
8+
def run(self):
9+
pass
10+
11+
def restart(self):
12+
pass
13+
14+
def stop(self):
15+
pass

schema.png

188 KB
Loading

setup.cfg

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[flake8]
2+
ignore =
3+
W503,
4+
F811
5+
exclude =
6+
tests/,
7+
*/migrations/,
8+
venv/,
9+
env/
10+
per-file-ignores =
11+
*/settings.py:E501
12+
max-complexity = 10

0 commit comments

Comments
 (0)