Управление параллелизмом в Джанго - PullRequest
0 голосов
/ 24 сентября 2018

Я работаю над веб-приложением, разработанным с Django, который предоставляет API отдыха для бронирования билетов.Для этого я определил некоторые представления, которые взаимодействуют с базой данных через ORM.Мое приложение имеет некоторые важные функции, такие как функция бронирования.

Более или менее, он имеет следующую структуру:

def book(params...):
    # check ticket availability
    # define some stuff which will we added to the new ticket entity
    # save new ticket entity

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

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

1 Ответ

0 голосов
/ 24 сентября 2018

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

Вы должны гарантировать, что каждый процесс read> process> write выполняется независимо от других, поэтому, например, если у вас есть несколько потоков Django в одном приложении, когда вызывается ваша функция "book", вы должны избегать попадания в нее других потоков.функция (или, по крайней мере, чувствительные к параллелизму части).Вы можете достичь этого с помощью контроллеров параллелизма, таких как семафоры или мониторы.Взгляните здесь и здесь .

Ваш код должен выглядеть примерно так:

def book(params...):
    LOCK()
    # check ticket availability
    # define some stuff which will we added to the new ticket entity
    # save new ticket entity
    UNLOCK()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...