Понимание важности асинхронного программирования
Когда мы начинаем создавать веб-приложение, нас не волнует, насколько оно производительно (и, честно говоря, мы не должны этого делать). Наша цель — провести базовый POC и посмотреть, получит ли он какую-то аудиторию. Этот подход хорошо подходит до тех пор, пока ваша пользовательская база не превысит число. Давайте посмотрим, что происходит, когда ваша пользовательская база растет.
Ваш сервер получает 5 запросов каждую секунду. У вас есть обратный прокси-сервер, предназначенный для пересылки этих запросов на ваш HTTP-сервер. Вы настроили свой HTTP-сервер для пересылки этих запросов вашему приложению, которое, в свою очередь, обрабатывает запросы один за другим и возвращает ответ. Если вы работаете с такой платформой, как Django, которая использует Python, который имеет ограничения, когда дело доходит до запуска параллельных процессов, этот подход может вызвать проблемы. Если вы один из разработчиков приложений и мало что сделали для оптимизации своих конечных точек, то поверьте мне, ваше приложение полностью зависит от удивительной архитектуры вашего HTTP-сервера и обратного прокси-сервера!
Когда к вашему сервису поступает много запросов, оптимизация кода вашего приложения за счет уменьшения количества циклов или замены операций встроенными функциями может быть ограничена. Асинхронное программирование вам в помощь! Это новая парадигма программирования. Это не интуитивно. Когда я научился этому сам, мне было очень трудно это понять. Но это эффективно!
Объяснить, будто я пятилетний ребенок?
Допустим, пользователь создает профиль на вашем сайте. Теперь вам нужно отправить письмо на их электронный адрес с просьбой подтвердить. Но когда сервер пытается отправить почту, он должен связаться с SMTP-сервером, дождаться его ответа, отправить сообщение, дождаться подтверждения.
Посмотрите, сколько ожидания выполняется сервером? Что, если в это время он сможет выполнять другие задачи, а не простаивать?
Теперь это уменьшит общее время, необходимое для завершения процесса. Следовательно, в таких сценариях мы отказываемся от нашего шаблона выполнения кода построчно и используем асинхронные функции для ускорения выполнения.
Другой способ думать об асинхронности — понять, что такое блокирующие и неблокирующие задачи. В бэкенде, когда вы запрашиваете некоторые данные из базы данных, процесс, выполняющий вашу программу, ожидает ответа от базы данных и бездействует. В этом случае он блокирует выполнение дальнейшего кода.
В то время как некоторые языки, такие как Javascript, имеют асинхронные вызовы AJAX по умолчанию, в других языках, таких как Python, вам придется намеренно делать свои запросы асинхронными.
Некоторые из сценариев, в которых вы могли бы рассмотреть возможность выполнения асинхронной операции:
- Когда пользователь хочет импортировать CSV-файл записей и создавать профили на основе данных, указанных в нем. Ваш сервер получает файл и подтверждает пользователю, что вы обрабатываете запрос, в то время как в фоновом режиме вы создаете записи.
- Когда пользователю нужны данные из нескольких источников, и вы должны делать HTTP-запросы к каждому из них. Вы можете создать асинхронную операцию для каждого источника и выполнять операцию выборки параллельно.
Как это сделать?
У каждого языка есть свой способ сделать это. В то время как в javascript для этого есть ключевые слова async/await, в Java есть потоки, а в Python — и то, и другое. Какой метод лучше всего подходит для вашего сценария или языка, вам нужно изучить. Например, если вы программируете на Python, вам не нужно начинать программировать асинхронные функции с нуля.
- Если вам нужно делегировать выполнение функции другому процессу, вы можете взглянуть на Проект Celery. Этот инструмент невероятен, и каждый, кто начал работать с Python в масштабе, должен научиться его использовать.
- Если вам нужно сделать несколько запросов асинхронно, вы можете взглянуть на grequests
Если вы хотите углубиться в то, как писать асинхронные программы с нуля, вы можете посмотреть это руководство от Tech with Tim — Видео.
Сейчас я не буду вдаваться в обсуждение параллелизма и параллелизма. Это тема для другого поста. Следите за обновлениями!
Когда это не очень хорошая идея?
Асинхронное программирование не подходит, если ваши задачи интенсивно используют ЦП, поскольку асинхронное программирование использует время простоя ЦП, когда он выполняет операции ввода-вывода.
Поэтому, если вы используете модель глубокого обучения для анализа изображения, это не сильно поможет масштабировать ваше приложение.
Еда на вынос
Освойтесь с кодом, который не выполняется линейно. Это потребует некоторых усилий, но также поможет вам создавать безумно масштабируемые приложения.
Want to Connect? If you enjoyed this, you can subscribe to my Software Engineering Weekly newsletter and get similar stories directly in your inbox