Обработка параллелизма в веб-приложении на основе Python

1

Я разрабатываю веб-приложение на фляже, python, sqlalchemy и postgresql. Мой вопрос здесь в отношении обработки параллелизма в этом приложении.

Как я написал приложение:

Я беру пример добавления пользователя в базу данных. Я отправляю форму и вызывается. Я обрабатываю все данные формы, а затем вызываю add_user (* arg), который использует код sqlalchemy для вставки пользователя в базу данных и возвращается при успешном выполнении, и я возвращаю ответ из представления.

Я предположил:

Хорошо, теперь я предположил, что мой веб-сервер (который я еще не решил) будет либо порождать поток, либо процесс, если два пользователя будут пытаться зарегистрироваться в одно и то же время и будут обрабатывать все согласованные требования.

  1. Нужно ли писать код с резьбой здесь? По потоковому коду я имею в виду, что перед записью я приобретаю замок и после записи его выпуска.
  2. Я новичок в разработке веб-приложений и многопоточности/многопроцессорной программировании, и мне хотелось бы получить некоторые рекомендации о том, как писать веб-приложение, которое хорошо справляется с параллелизмом.
  3. Написание обработки параллелизма с начала является правильным, или эта мысль должна наступить, когда большое количество одновременных пользователей использует webapp. Даже если это нужно сделать позже, я бы хотел, чтобы некоторые указатели об этом.

В принципе, я понятия не имею о параллельной части разработки webapp. Если вы можете указать на ресурсы, откуда я могу узнать больше об этом, это будет очень полезно.

Теги:
multithreading
web-applications
concurrency

1 ответ

5
Лучший ответ

Flask будет выполнять каждый запрос в отдельном потоке или даже в отдельных процессах. Количество потоков и процессов для появления определяется WSGI-сервером (например, Apache с mod_wsgi).

Если вы используете SQLAlchemy ScopedSessions, сеанс отлично потокобезопасен. Вы не должны делиться объектами, контролируемыми ORM, через потоки (но в большинстве случаев вы не позволяете своим объектам жить дольше, чем запрос, так что это обычно не вызывает беспокойства).

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

Если вы создаете свои собственные долгоживущие объекты в своем приложении, что вам, скорее всего, не нужно делать, и если эти объекты обмениваются или обмениваются данными с кодом обработки запроса, тогда вы должны принять соответствующие меры предосторожности, чтобы избежать проблем синхронизации (условия гонки, взаимоблокировки, использование библиотек, которые не являются потокобезопасными и т.д.),

  • 0
    Что происходит с mod_wsgi, объясняется в code.google.com/p/modwsgi/wiki/ProcessesAndThreading
  • 0
    @jd Что вы подразумеваете под разделением состояния между запросами? Я сохраняю объект sqlalchemy моего текущего пользователя в сеансе пользователя и снова объединяю его с текущим сеансом sqlalchemy при следующем запросе. Это разделение штата?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню