2011-06-15 69 views
4

關於過濾器 鏈的非常酷的部分是,每個過濾器不會等待 爲以前的過濾器完成;它可以在生產過程中處理之前的過濾器的 輸出,類似於Unix流水線的 。 (從here一個nginx工作進程是否同時處理兩個請求或逐個處理兩個請求?

我想上述在每個過濾器的端部談到這樣的代碼

if (!chain_contains_last_buffer) 
    return ngx_http_next_body_filter(r, in); 

即,nginx的鏈濾波器逐個。 但是,因爲它的在每個過濾器的末尾,它必須等到當前的過濾器完成。我看不出nginx如何設法制作each filter doesn't wait for the previous filter to finish

所以上面是關於nginx的過濾器的併發性,其次是關於nginx的請求處理併發:

正如我們所知道的nginx使用epoll處理請求:

events = epoll_wait(ep, event_list, (int) nevents, timer); 
for (i = 0; i < events; i++) { 
    ... 
    rev->handler(rev); 
} 

有了這樣的代碼上面,我不認爲nginx可以同時處理兩個請求,它只能一個接一個地完成(每個handler完成它的工作足夠快,以便下一個請求很快得到處理),對吧?

或者是否有任何遺失的遺漏?

+0

你是對的。 Nginx無法在一名工作人員中同時處理兩個或更多的請求。 – CyberDem0n 2011-06-15 08:05:24

+1

@ Cyber​​Dem0n,過濾器流水線的事情呢?從理論上講,我認爲在沒有線程的情況下,在單個進程中是不可能的。 – cpuer 2011-06-15 08:13:33

回答

1

有一種測試方法。寫一個睡覺的過濾器,並在過濾器鏈中使用它。然後測試一下,看看是否可以在前一個請求正在休眠時讓nginx提供請求。

然後再次運行測試,但這次不要讓過濾器的睡眠,讓等待使用select超時像這樣:

/* wait 1.5 secs */ 
struct timeval tv; 
tv.tv_sec = 1; 
tv.tv_usec = 500000; 
select(0, NULL, NULL, NULL, &tv); 
相關問題