одновременная обработка в тонком, единороге, пуме, вебрике

Если у меня есть следующее действие в контроллере

def give_a
 print a
 a = a+1
end

Что происходит на каждом веб-сервере, когда приходит запрос и когда поступает несколько запросов?

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

Что происходит на параллельных веб-серверах, таких как puma или unicorn (возможно, другие) Если поступает 2 запроса и их обрабатывают 2 потока unicorn, будут ли оба ответа давать одно и то же значение a? (в ситуации, когда оба запроса входят в метод одновременно)

или все зависит от того что происходит на самом сервере и доступ к данным последовательный?

Есть ли способ иметь мьютекс/семафор для параллельных веб-серверов?


person Nick Ginanto    schedule 04.03.2013    source источник


Ответы (1)


afaik, приложение rails делает YourController.new с каждым запросом env.

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

person phoet    schedule 04.03.2013
comment
спасибо, запросы к базе в одну очередь (в стандартном приложении)? - если a - это значение, взятое из базы данных - person Nick Ginanto; 05.03.2013
comment
очередь? нет, очереди нет! если вы хотите гарантировать, что значения не изменятся во время запроса, вам необходимо заблокировать базу данных. это очень плохая практика, называемая пессимистической блокировкой. то, что вы обычно делаете, это оптимистическая блокировка с использованием предложений where. - person phoet; 05.03.2013