Giter VIP home page Giter VIP logo

yandex-async-python-review's Introduction

Hello there 🔭

Experienced backend artisan, skilled in diverse project realms. Driven to lend expertise to meaningful initiatives. If you have a project that could utilize my abilities, please DM me.

Visitors

Typing SVG

Project Portfolio

Projects

Name Description Stack Link
NFT showcase utilities Place where you can store all your achievements Django, PostgreSQL, Redis, Celery, Web3, NFT, IPFS, OAuth2 Link
Mobile Market Analytics Website Site for mobile market (Google Play, App Store) analytics Django, MySQL, Clickhouse, ElasticSearch Link
- Public API API for integration with site's data FastAPI, MySQL Link
- Chat GPT integration A demo app showcasing ChatGPT integration with site's data Langchain, OpenAI [Limited Use]
Bank service Internal Use System FastAPI, PostgreSQL Link
- AML System for bank An internal anti-money laundering system Flask, PostgreSQL, MongoDB, RabbitMQ (Internal Use)
- Scoring system for bank An internal credit scoring system FastAPI, PostgreSQL, Redis, Celery (Internal Use)
Networking app An app for sharing digital business cards Blacksheep, PostgreSQL, Redis, Celery, OAuth2 Link
Social initiatives app An app for social initiatives FastAPI, PostgreSQL, MongoDB, Redis, Celery [Limited Use]
Museum app A virtual museum tour app [Technical Management] Link
Educational app An educational app for internal use [Technical Management] (Internal Use)

NDA Projects

Name Description Stack
Marketplace (Microservices) Marketplace, that parse info from various sites AioHTTP, Redis, RabbitMQ
Task tracker Pre-sale task tracker Django, PostgreSQL, Celery, Redis
Promo sites Various promotional websites FastAPI, Django, PostgreSQL
Voice Assistant A voice-based virtual assistant Aiogram
Admission helper bot A chatbot for university admissions VKBottle, Asyncio, Aiogram, PostgreSQL
Delivery app A food delivery app FastAPI, PostgreSQL, Redis

Hackathons

Year Hackathon Project Result
2020 Raiffeisen Bank Hackathon Using QR codes in fast payment system Top 10
2020 Facebook AI Hack F.A.Q. Bot Participant
2020 Leaders of Digital System for electrical engineers Top 10
2021 Devpost Hackathon Game creation Participant
2021 Leaders of Digital Semi-finals Solution for Food Distribution 1st Place
2021 Leaders of Digital Final System for Startup Applying 1st Place
2022 X-MAS Hack Drone Coordinating Algorithm 2nd Place
2023 The Youth Beat Internal System for Transportation Top 10

yandex-async-python-review's People

Contributors

pavivin avatar

Watchers

 avatar

yandex-async-python-review's Issues

Ревью

Ревью

Привет!
В следующий раз лучше писать в чат, когда понимаешь что не можешь сдвинуться с мёртвой точки.

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

Основные моменты

  • Используешь @coroutine прямо в планировщике. Получается, асинхронно забираешь список задач. В данном случае, это не имеет смысла, так как это не улучшает производительность. Нужно запускать задачи асинхронно. Чтобы это работало, нужно использовать @coroutine внутри Job.

@coroutine # здесь не надо использовать coroutine, @coroutine надо добавить на Job
def schedule(self):
processes = []

  • Дальше, используешь multiprocessing. Решение должно основываться на корутинах, так что предлагаю сделать в три этапа:
  1. Создать стандартный планировщик без корутин, многопроцессорности и много поточности. (Пример). Также использовать pythontutor.com для понимания того, как идёт процесс выполнения задач.
  2. Переделать задачи в корутины и вызывать их в планировщике
  3. Добавить запуск корутин в multiprocessing
    (Пример 1,
    Пример 2)
  • Также, лучше не использовать while True, а явно идти по всем задачам.
    Как раз для таких задач есть очередь, дек, а также очередь в модуле multiprocessing.

Использование multiprocessing

Из-за отсутствия синхронизации не всегда задачи выполняются правильно. Так как они связаны между собой. При не связанных задачах, например расчёт чего-то будет проходить нормально

С использованием condition, лучше вызываешь методы notify и notify_all или указывать Lock.
Статья о том, как использовать condition
https://superfastpython.com/multiprocessing-condition-variable-in-python/

Статья с примерами разных задач в multiprocessing.
https://zetcode.com/python/multiprocessing/

Для запуска

  • Нет файла или модуля "logger"
    • Добавить файл с конфигурацией логгера

Очень неприятная вещь

job2 = Job(
func=copy_file,
name="Удалить файл",
args=(condition,),
)
job3 = Job(
func=delete_file,
name="Скопировать файл",
args=(condition,),
)

Задача с копированием файла и удалением перепутаны в названии. Это очень сильно может запутать при отладке.

Мелкие правки

  • Не отформатировано по PEP8.
    • Можно установить black - это форматтер, с которым не придётся постоянно править код руками (https://semakin.dev/2020/05/black/)
  • Декоратор два раза определён в файлах job и scheduler. Это нарушает принцип DRY (https://blog.vverh.digital/2022/dont-repeat-yourself-or-dry/). Повторяющиеся части кода можно вынести в отдельный файл и импортировать из него.
  • Где-то используется print, где-то логирование. Все выводы лучше именно логировать, они будут в едином формате, также будут в одном месте, если например захочешь писать в файл.
  • В контейнерах (list, dict) указывай какие типы данных будет. Подсказки типов будут лучше и писать код можно писать без очевидных ошибок

Вместо

    def schedule(self):
        processes = []

Надо

    def schedule(self):
        processes: list[YourType] = []
  • Класс Scheduler явно наследуется от object, с 3 версии Python это не нужно делать. Аналогично с super().init()
    class Scheduler(object): # с 3 версии Python не нужно наследовать от класса
    def __init__(
    self,
    max_working_time=1,
    tries=0,
    dependencies=(),
    start_at=None,
    ):
    super().__init__() # лишнее действие
  • В методах copy_file и delete_file используется параметр x=None. Он нужен для универсальности использования методов. Лучше явно назвать что это за метод, либо использовать args и kwargs.
  • Не обработана ситуация, что ключ не найден. Можно при первоначальной обработке запроса это сделать либо в этом же месте.
    setup = data['setup']
    punchline = data['punchline']
  • Название файла можно вынести начало файла и использовать в каждом Job. Также сразу преобразовать в Path
    def get_and_write_data(condition, url):
    context = ssl._create_unverified_context()
    file = 'punchline.txt'

    def copy_file(condition, x=None):
    file = 'punchline.txt' # файл не создан / не приложен к задаче

    def delete_file(condition, x=None):
    file = 'punchline.txt'

Итого

  1. Используйте корутины и генераторы при решении. Использование потоков и процессов не запрещено, но база решения должна строиться на использовании корутин. (+-)
  2. Использовать встроенные библиотеки и модули языка. (+)
  3. Используйте концепции ООП. (+)
  4. Используйте аннотацию типов. (-)
  5. Логируйте результаты действий. (+-)
  6. Покройте написанный код тестами. (-)
  7. Предусмотрите обработку исключительных ситуаций. (+-)
  8. Приведите стиль кода в соответствие pep8, flake8, mypy. (-)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.