类别: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网别的相干文章!

打赏

感谢您的赞助~

打开支付宝扫一扫,即可进行扫码打赏哦~

版权声明 : 本文未使用任何知识共享协议授权,您可以任何形式自由转载或使用。

 可能感兴趣的文章