Мне сложно свернуть голову вокруг модели openresty (или nginx's) concurrency. Я читал область переменных Lua, которая объясняет время жизни переменных, но ничего не говорит о параллельном доступе к ним.
Трудно объяснить словами, поэтому позвольте мне попытаться объяснить с помощью кода. Представьте, что у меня есть этот модуль Lua:
local counter = {count = 0}
function counter.incr(amount)
counter.count = counter.count + (amount or 1)
end
return counter
И затем я использую его в openresty следующим образом:
server {
location /incr {
content_by_lua '
local counter = require 'counter'
counter.incr(1)
'
}
location /decr {
content_by_lua '
local counter = require 'counter'
counter.incr(-1)
'
}
location /count {
content_by_lua '
local counter = require 'counter'
ngx.write(counter.count)
'
}
}
Я хочу понять модель concurrency, чтобы ответить на эти вопросы:
- Если я выполняю 10 одновременных вызовов
/incr
, а позже я вызываю/count
, могу ли я быть уверен, что результат будет 10 (я предполагаю, что нет, но почему)? - Если я выполняю 10 одновременных вызовов
/incr
и в то же время я делаю еще 10 до/decr
, могу ли я быть уверен, что/count
вернет 0? - Как количество работников влияет на результаты?
- Как влияет на результат фазу, в которой происходит код (т.е.
init_by_lua
вместоcontent_by_lua
)?