因為要處理 耗時的接口 一個接口請求大概要3秒 是第三方接口 不占用服務(wù)器資源 打算開200個線程 處理 實在不行只能換swoole 協(xié)程
協(xié)程保存上下文需要使用內(nèi)存,本質(zhì)上還是用內(nèi)存換效率,消費能力也是生產(chǎn)=消費,如果任務(wù)累積到一定程度,那么內(nèi)存占用還是很高,下游的消費速度還是很重要的;建議使用隊列,消費者數(shù)量>生產(chǎn)者數(shù)量保證消費能力,隊列設(shè)置容量上限,以免生產(chǎn)>消費將資源耗盡。
你換協(xié)程也是等待,等待的時間會更長,swoole的協(xié)程沒記錯的話是單線程協(xié)程,也就是如果這個協(xié)程上被分配了100個3秒的請求,99個還是在等而已;webman開的進程數(shù)也是接收的數(shù)據(jù)在等罷了,超出了當前進程設(shè)置的buffer以后才會拒絕,每超出buffer的話,請求是在排隊。
同上,建議走隊列,假如一個請求要3秒,這3秒算是硬性資源,不會因為你用了協(xié)程它就變成了只要1秒
協(xié)程是好東西,但不是解決一切問題的良藥
遇到跟樓主同樣的問題,比如某個服務(wù)需要請求第三方的結(jié)果并立即返回給前端,假設(shè)這種情況下,同時200用戶請求,這個時候webman應(yīng)該沒解了吧?還是說開個200進程?隊列不能立即返回,這種方案暫不考慮。
如果是其他語言,解決的方案也是開線程,線程達到上限了也是阻塞等待;
這種情況在做大數(shù)據(jù)相關(guān)的項目的時候比較多見,一個計算任務(wù)少則幾百毫秒,多則上分鐘,通常來說有以下幾種解決方案:
如果本身就要阻塞等待結(jié)果,那么最好的方式就是排隊,進程數(shù)開大一點,http buffer設(shè)置高一些,但實際上不能根本解決這個問題。