這篇文章將為大家詳細講解有關(guān)swoole task會不會阻塞,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的洱源網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!如果有仔細看過 swoole task 的文檔的話,應(yīng)該都會注意到這句話
task操作的次數(shù)必須小于onTask處理速度,如果投遞容量超過處理能力,task會塞滿緩存區(qū),導致worker進程發(fā)生阻塞。
worker進程將無法接收新的請求
task 如果阻塞會引發(fā) woker 進程阻塞,造成服務(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的時間依次累加,直到達到較大值 100ms,達到 cpu 使用率和處理數(shù)據(jù)實時性的一個平衡,具體平衡點可以根據(jù)自己的業(yè)務(wù)按需調(diào)整。
關(guān)于“swoole task會不會阻塞”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。