2017-02-20 24 views
0

Я хотел бы использовать OpenResty с Lua-интерпретатором.Открытые одновременные запросы

Я не могу заставить среду OpenResty обрабатывать два параллельных запроса на две отдельные конечные точки. Я симулировать, что один запрос делает некоторые жесткие расчеты, запустив в длинном цикле:

local function busyWaiting() 
    local self = coroutine.running() 
    local i = 1 
    while i < 9999999 do 
     i = i + 1 
     coroutine.yield(self) 
    end 
end 

local self = coroutine.running() 
local thread = ngx.thread.spawn(busyWaiting) 

while (coroutine.status(thread) ~= 'zombie') do 
    coroutine.yield(self) 
end 


ngx.say('test1!') 

Другая конечная точка просто посылает ответ немедленно. ngx.say('test2')

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

Установка параметра nginx worker_processes 1; на большее число тоже не помогает, и я хотел бы иметь только один рабочий процесс.

Каким образом можно позволить OpenResty обрабатывать дополнительные запросы и не блокироваться первым запросом?

+0

Вы не указали какой-либо код, показывающий нам, как вы отправляете подзапросы. Я предполагаю, что вы используете что-то вроде ngx.location.capture для отправки подзапросов в конечные точки. Вы должны использовать https://github.com/openresty/lua-nginx-module#ngxlocationcapture_multi API для параллельных подзапросов. –

+0

Я не использую ngx.location.capture. Я использую два отдельных клиента для подключения к двум различным конечным точкам на одном сервере. – JeFf

+0

@JeFi извините, не понял ваш случай использования, теперь понятно, см. Мой ответ ниже –

ответ

0
local function busyWaiting() 
    local self = ngx.coroutine.running() 
    local i = 1 
    while i < 9999999 do 
     i = i + 1 
     ngx.coroutine.yield(self) 
    end 
end 

local thread = ngx.thread.spawn(busyWaiting) 

while (ngx.coroutine.status(thread) ~= 'dead') do 
    ngx.coroutine.resume(thread) 
end 


ngx.say('test1!') 
+0

Изменение 'coroutine.yield' на' coroutine.resume' во втором цикле while не приводит к тому, что интерпретатор будет продолжать с помощью переменной приращения coroutine 'i'. Переменная 'i' увеличивается до значения 2. Второй цикл while становится бесконечным. – JeFf

+0

К сожалению, вы работаете в контексте Openresty, добавляете «ngx». префикс для всех API –