這篇文章將為大家詳細(xì)講解有關(guān)swoole task會不會阻塞,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)始終堅持【策劃先行,效果至上】的經(jīng)營理念,通過多達(dá)十多年累計超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:隧道混凝土攪拌車等企業(yè),備受客戶表揚(yáng)。
如果有仔細(xì)看過 swoole task 的文檔的話,應(yīng)該都會注意到這句話
task操作的次數(shù)必須小于onTask處理速度,如果投遞容量超過處理能力,task會塞滿緩存區(qū),導(dǎo)致worker進(jìn)程發(fā)生阻塞。
worker進(jìn)程將無法接收新的請求
task 如果阻塞會引發(fā) woker 進(jìn)程阻塞,造成服務(wù)無法工作,引發(fā)問題。
我曾經(jīng)使用 task 發(fā)送服務(wù)的鏈路日志,接收日志的服務(wù)出現(xiàn)bug,造成發(fā)送日志的 task 阻塞,然后服務(wù) gg 的情況,之后我就對 task 做了一波優(yōu)化。
思路就是使用 swoole channel 和 swoole user process 實現(xiàn)一套 task 。
使用 channel 接收數(shù)據(jù),然后在 user process 消費數(shù)據(jù),假如 channel 滿了僅僅會造成 push 數(shù)據(jù)失敗,并不會引發(fā)阻塞,因為是鏈路日志,是允許丟失的,所以這個方案完全沒問題。
在swoole user process 消費 channel 的策略的偽代碼如下
$sleepTime = 5; $maxSleepTime = 100; while (true) { $task = $chan->pop(); if ($task === false) { $sleepTime = $sleepTime + 5; if ($sleepTime > $maxSleepTime) { $sleepTime = $maxSleepTime; } usleep($sleepTime * 1000); continue; } $sleepTime = 0; // 處理數(shù)據(jù) }
如果消費到channel的數(shù)據(jù),就使用死循環(huán)處理數(shù)據(jù),因為處理數(shù)據(jù)過程中是有其他操作的,所以并不會占用大量 cpu。
如果消費不到數(shù)據(jù),就 sleep 5ms,sleep的時間依次累加,直到達(dá)到最大值 100ms,達(dá)到 cpu 使用率和處理數(shù)據(jù)實時性的一個平衡,具體平衡點可以根據(jù)自己的業(yè)務(wù)按需調(diào)整。
關(guān)于“swoole task會不會阻塞”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。