最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

swoole task会阻塞么

来源:动视网 责编:小采 时间:2020-11-03 18:22:54
文档

swoole task会阻塞么

swoole task会阻塞么:如果有仔细看过 swoole task 的文档的话,应该都会注意到这句话task操作的次数必须小于onTask处理速度,如果投递容量超过处理能力,task会塞满缓存区,导致worker进程发生阻塞。worker进程将无法接收新的请求 (推荐学习: swoole视频教程)task
推荐度:
导读swoole task会阻塞么:如果有仔细看过 swoole task 的文档的话,应该都会注意到这句话task操作的次数必须小于onTask处理速度,如果投递容量超过处理能力,task会塞满缓存区,导致worker进程发生阻塞。worker进程将无法接收新的请求 (推荐学习: swoole视频教程)task


如果有仔细看过 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会阻塞么

swoole task会阻塞么:如果有仔细看过 swoole task 的文档的话,应该都会注意到这句话task操作的次数必须小于onTask处理速度,如果投递容量超过处理能力,task会塞满缓存区,导致worker进程发生阻塞。worker进程将无法接收新的请求 (推荐学习: swoole视频教程)task
推荐度:
标签: ta 阻塞 task
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top