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





FastAPI немного выходит за рамки решения этой конкретной проблемы и не имеет способа или механизма, специально предназначенного для этого. Вам нужно будет решить, как лучше всего смягчить условия гонки для файлов в целом, независимо от того, FastAPI на Python или любая другая технология или язык.
Хотите ли вы заблокировать файл для операций записи (используя блокировку чтения и записи) или вы хотите, чтобы пользователи одновременно редактировали один и тот же файл (что может оказаться довольно сложным)? Если разрешена только одна запись, то это просто блокировка чтения-записи (т. е. разрешено множественное чтение, но запись эксклюзивна), возможно, с управлением версиями, чтобы пользователи не могли писать устаревшие файлы. Это можно реализовать с помощью базы данных.
Важно использовать базу данных или постоянное хранилище, если вы планируете масштабировать более одного экземпляра своего серверного приложения. В этом случае два или более экземпляров должны глобально использовать одни и те же блокировки. В противном случае многопоточности и базовых блокировок в Python должно быть достаточно.
Вероятно, более подробная информация о том, как следует использовать файлы, особенно для записи, позволит нам предложить лучшие и более подробные решения.
Файлы содержат информацию и состоят из следующего: пользователь может просмотреть файл, но я хочу гарантировать, что доступ к нему будет возможен только после того, как пользователь сохранит в нем изменения, чтобы избежать ошибок. Точно так же я хотел бы, чтобы, если два администратора записывают информацию и оба нажимают кнопку «Сохранить» во внешнем интерфейсе, один должен обрабатываться раньше другого, чтобы избежать проблем. Я изучал и обнаружил, что для веб-приложений и обработки файлов полезно использовать asyncio с блокировкой, вы его использовали?
Я также думал о сохранении информации в таблице в базе данных, а не в файлах, чтобы избежать этого, как вы сказали, есть ли в базах данных такое состояние гонки?
Базы данных сами имеют дело с условиями гонки. Да, это предотвращает одновременную запись двух пользователей, но это не значит, что это решает все проблемы. Представьте себе, что два пользователя одновременно открывают документ для записи. После того как первый пользователь зафиксирует свои изменения, у второго пользователя останется старая версия документа. Должен ли второй пользователь просто перезаписать? Или они должны получить ошибку? Или их версия документа должна обновляться в режиме реального времени, как это происходит, например, в Документах Google?
Использование asyncio с блокировкой работает хорошо, если вы знаете, что будет работать только один экземпляр с серверной частью. Но это просто не масштабируется. Если вы когда-нибудь создадите второй экземпляр серверной части, эти блокировки не будут использоваться совместно. Единственный способ совместно использовать блокировку — использовать запись базы данных в качестве общей блокировки между двумя или более экземплярами. Использование asyncio с блокировками Python действительно намного проще, но, опять же, оно работает только в том случае, если всегда выполняется один внутренний процесс.
что за файл? Sqlite помогает?