Как управлять условиями асинхронной гонки, когда файл изменяется в API?

Я разрабатываю полнофункциональное приложение, используя FastAPI для серверной части. В этом приложении один или несколько пользователей могут запрашивать (читать) файл, а несколько администраторов могут изменять (записывать) его одновременно. Меня беспокоит возможность возникновения условий гонки и других проблем с параллелизмом, которые могут возникнуть из-за этих одновременных операций, но я не знаю, как реализовать это асинхронным способом, я использовал только многопоточность и многопроцессорность.

Подробности проблемы:

  • Пользователи: могут запрашивать (читать) файл.
  • Администраторы: могут одновременно изменять (записывать) файл.

Вопросы:

  1. Как избежать состояния гонки, если несколько администраторов могут одновременно изменять файл?
  2. Какова наилучшая стратегия обеспечения согласованности данных, когда пользователи читают файл, а администраторы его изменяют?
  3. Какие методы или инструменты я могу реализовать в FastAPI для эффективного решения этих проблем параллелизма?

Дополнительный контекст:

  • Бэкэнд: FastAPI
  • Фронтенд: Фреймворк может быть React, Vue и т. д.

Я был бы признателен за любые советы, лучшие практики и примеры реализации для решения этих проблем параллелизма в моем полностековом приложении. Спасибо!

что за файл? Sqlite помогает?

Tom Chen 29.05.2024 06:07

.txt, мои файлы содержат определенную информацию, которую пользователи могут читать и изменять.

Br0k3nS0u1 29.05.2024 06:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Файлы содержат информацию и состоят из следующего: пользователь может просмотреть файл, но я хочу гарантировать, что доступ к нему будет возможен только после того, как пользователь сохранит в нем изменения, чтобы избежать ошибок. Точно так же я хотел бы, чтобы, если два администратора записывают информацию и оба нажимают кнопку «Сохранить» во внешнем интерфейсе, один должен обрабатываться раньше другого, чтобы избежать проблем. Я изучал и обнаружил, что для веб-приложений и обработки файлов полезно использовать asyncio с блокировкой, вы его использовали?

Br0k3nS0u1 29.05.2024 18:42

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

Br0k3nS0u1 29.05.2024 18:48

Базы данных сами имеют дело с условиями гонки. Да, это предотвращает одновременную запись двух пользователей, но это не значит, что это решает все проблемы. Представьте себе, что два пользователя одновременно открывают документ для записи. После того как первый пользователь зафиксирует свои изменения, у второго пользователя останется старая версия документа. Должен ли второй пользователь просто перезаписать? Или они должны получить ошибку? Или их версия документа должна обновляться в режиме реального времени, как это происходит, например, в Документах Google?

Vlad Rusu 31.05.2024 09:11

Использование asyncio с блокировкой работает хорошо, если вы знаете, что будет работать только один экземпляр с серверной частью. Но это просто не масштабируется. Если вы когда-нибудь создадите второй экземпляр серверной части, эти блокировки не будут использоваться совместно. Единственный способ совместно использовать блокировку — использовать запись базы данных в качестве общей блокировки между двумя или более экземплярами. Использование asyncio с блокировками Python действительно намного проще, но, опять же, оно работает только в том случае, если всегда выполняется один внутренний процесс.

Vlad Rusu 31.05.2024 09:17

Другие вопросы по теме