Обновить
0
0
Dmitry@dx-77

Python Backend Developer

Отправить сообщение

Тема холиварная, конечно.

По первому пункту. Можно обойтись монолитом. Никто ж не запрещает в монолите юзать, к примеру, кафку и партнёры точно также получат быстро 200 код, а обработка будет точно также в фоне)

Второй пункт. Можно обойтись монолитом. Этот тяжёлый флоу можно тоже "обойти". Запускать в отдельном инстансе, например, или крон таской, да хоть селери таской)

Я бы даже сказал, что монолита почти всегда хватит) А проблема с S3, описанная в статье, вообще не проблема, так как она никак не зависит от бэкенда и его реализации, даже если он почему-то однопоточный и однопроцессный (хотя так никто не делает) И тормозить ничего не будет, если хоть немного почитать доку S3

Не обязательно городить микросервисы для того, чтобы загрузить файл на S3. Достаточно монолита. Достаточно даже синхронного монолита на Питоне.

Ну да, а в России общепринято, что N это 1, 2, 3... Как говорится "у ней особенная стать"

Группа Бурбаки в 20 веке решила ввести свою аксиоматику у которой есть как сторонники, так и противники. Но имхо, она идет в разрез с этимологией слова "натуральные" ну и самим способом их появления идущим ещё со времен до н.э. А так да, удобно в теории множеств считать число 0 натуральным. Как по мне французы заоверрайдили этот термин по-своему, но пора прекращать холиварный оффтоп)

Небольшая поправка

натуральных чисел a и b (b не равно нулю)

Натуральные числа они по определению больше нуля

def check_is_visible(view):

syntax = view.settings().get("syntax")

return syntax.endswith("SQL.sublime-syntax")

А чем не подошёл Firebase Remote Config ?

Ещё можно так писать

try:

response = requests.get()

if response.ok:

...

except requests.RequestException as err:

...

В Python 3.9 и выше вместо typing.List[str] и typing.Dict[str, str] можно писать list[str] и dict[str,str]

Пожалуйста, в исходники asyncpg, там как раз асинхронные контекстные менеджеры - для создания пула, получения коннекшена из пула, создания транзакции и др. Например, вот и вот

Если хочется именно Celery "сделать" асинхронным, то можно действовать примерно так:

class AsyncTask(celery.Task):
    async def apply_async(self, *args, **kwargs):
        ...

    async def async_run(self, *args, **kwargs):
        ...

    def __call__(self, *args, **kwargs):
        return self._get_app().loop.run_until_complete(self.async_run(*args, **kwargs))


class AsyncCelery(celery.Celery):
    task_cls = AsyncTask

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._loop = None

    @property
    def loop(self):
        if self._loop is None:
            try:
                self._loop = asyncio.get_running_loop()
            except RuntimeError:
                self._loop = asyncio.new_event_loop()
        return self._loop


    @property
    async def async_connection(self):
        # тут работа с aio_pika

    async def send_task_message(self, *args, **kwargs):
        # тут работа с aio_pika

    async def send_task(self, *args, **kwargs):
        ...

celery_app = AsyncCelery('project')

@celery_app.task
async def execute_something(*, app, **kwargs):
      ...

 # ну и соответственно в коде для отложенного вызова таски мы будем писать вот так
...
await execute_something.apply_async(**kwargs)
...

Плюсы, на мой взгляд, очевидны, ну а минусы - чем больше мы используем фишек Cелери, тип больше будет разрастаться класс AsyncCelery.

З.Ы. @kield Спасибо за статью. И не надо уходить из Питона. Python рулит)

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Бэкенд разработчик
Средний
Python
Django
PostgreSQL
MongoDB
Linux
Nginx
Docker
Git