类别:Swoole / 日期:2019-12-16 / 浏览:202 / 评论:0

如果有细致看过 swoole task 的文档的话,应当都邑注意到这句话
task操纵的次数必需小于onTask处置惩罚速率,如果投递容量凌驾处置惩罚才能,task会塞满缓存区,致使worker历程发作壅塞。
worker历程将没法吸收新的要求 (引荐进修: swoole视频教程)
task 如果壅塞会激发 woker 历程壅塞,形成效劳没法事情,激发问题。
我曾运用 task 发送效劳的链路日记,吸收日记的效劳涌现bug,形成发送日记的 task 壅塞,然后效劳 gg 的状况,以后我就对 task 做了一波优化。
思绪就是运用 swoole channel 和 swoole user process 完成一套 task 。
运用 channel 吸收数据,然后在 user process 消耗数据,如果 channel 满了仅仅会形成 push 数据失利,并不会激发壅塞,由于是链路日记,是许可丧失的,所以这个计划完整没问题。
在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; // 处置惩罚数据 }
如果消耗到channel的数据,就运用死循环处置惩罚数据,由于处置惩罚数据过程当中是有其他操纵的,所以并不会占用大批 cpu。
如果消耗不到数据,就 sleep 5ms,sleep的时候顺次累加,直到到达最大值 100ms,到达 cpu 运用率和处置惩罚数据及时性的一个均衡,细致均衡点能够依据本身的营业按需调解。
以上就是swoole task会壅塞么的细致内容,更多请关注ki4网别的相干文章!