Pull to refresh

Comments 11

Очевидно что синхронный сервер будет быстрее т.к. в Вашем пинг/понг примере не происходит на самом деле никакой асинхронной работы. В данном случае асинхронный евент луп просто создает лишний оверхед т.к. нет никакого ввода/вывода. Если Вы хотите сравнить производительность то стоит добавить хотя бы одно асинхронное действие (например хттп запрос на внешний сервис)

тогда уж 2 http запроса, так как все равно программа что та, что эта будет ждать в основном результаты этого запроса. в случае 2 запросов, эти два запроса будут выполняться одновременно и уже будет видно значительное преимущество асинхронной модели.

В посте упущено очень важное замечание:

When a request comes in to an async view, Flask will start an event loop in a thread, run the view function there, then return the result.
Each request still ties up one worker, even for async views.

Flask запускает асинхронную вьюху в event loop в отдельном потоке (используя asgiref.async_to_sync) и синхронно ждёт, пока закончится выполнение этой асинхронной вьюхи, тем самым блокируя основной рабочий поток.

То есть входящие запросы обрабатываются всё так же синхронно, так что в большинстве задач улучшения производительности не будет. Зато будут накладные расходы на запуск event loop в отдельном потоке, что в посте и измерено.

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

Там же пишут

The upside is that you can run async code within a view, for example to make multiple concurrent database queries, HTTP requests to an external API, etc.

Так что, вероятно, всё работает, как задумано.

Хотя, да, грустно, кончено, что не полная асинхронность.

Странное решение. Ведь запустить евент-луп для выполнения одной корутины — это одна строчка кода:


asyncio.run(my_coroutine())

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

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

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

Непонятно что автор тестирует. Потери на асинхронный цикл при синхронном режиме работы?

Добавьте хотя бы sleep в 20 мс. для эмуляции запроса к БД (time.sleep(0.02) и asyncio.sleep(0.02)).

Скорее здесь асинхронность как промежуточный патч. Чтобы разработчики адаптировались. Так как когда я тестировал многие библиотеки не работали flask-login и.т.д. Интересно будет когда доработают сравнить с fastapi. А то очень часто их противопоставляли.

Sign up to leave a comment.

Articles