2017-02-20 55 views
0

我想與Lua解釋器一起使用OpenResty。Openresty併發請求

我不能讓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

在第二個while循環中將'coroutine.yield'改爲'coroutine.resume'不會導致解釋器繼續執行協程遞增變量'i'。變量'i'只增加到值2.第二個while循環變成無限。 – JeFf

+0

對不起,您正在Openresty上下文中添加「ngx」。所有API的前綴 –