同步队列为社么不等待Redis::send($queue, $data, 60)阻塞执行完

zhanghao

问题描述

这里写问题描述

同步队列为社么不等待Redis::send($queue, $data, 60); 执行完再显示redis queue test,而是立即显示redis queue test

截图

225 2 1
2个回答

efnic

控制器和队列分别属于不同的进程;

  • 暂无评论
小天天天天

你的理解有误.文档中没有"同步队列"这个概念,我觉得你搞混了"任务投递"和"任务执行".

队列任务投递方式有两种,异步投递,和同步投递

//异步投递
Client::send($queue, $data, 60);

//同步投递
Redis::send($queue, $data, 60);

同步投递有返回值,直接将任务放进队列,能明确的知道任务是否成功放入了队列
异步投递是先把任务放进内存,在异步的将消息放进队列,这就导致如果进程内存中的消息积压的情况下重启了,数据就丢了.

"队列"这个词已经明确的表示了任务是异步执行的.

举个例子:"邮件发送队列",由两部分代码共同完成,

第一部分代码只负责将邮件交给邮差(任务投递)(你截图中划红线的部分),
第二部分代码是邮差按照你投递的规则将邮件发给收件人(任务消费)

我们不妨改改你的问题"同步投递为什么不等待Redis::send($queue, $data, 60)阻塞执行完"

答:事实上Redis::send($queue, $data, 60);已经执行成功了,他完成了上述第一部分(投递)的任务,正确的把任务写入了队列

  • fklee 4天前

    说的对,生产生产,消费是消费,任务同步投递生产已经执行完了

🔝