不使用pcntl/pthreads/swoole的前提下, laravel该如何实现伪多进程?

引言

  • 众所周知,多进程/多线程可以并行/并发的执行多个任务,提高运行效率。

  • PHP默认是不支持多进程/多线程的,需要安装pcntl/pthreads扩展来支持。协程如果不用swoole等框架,那么实现比较复杂。

  • 以上方法均不使用,那么该如何提高程序的运行效率呢?

思路

  1. 对于耗时的任务, 通常会推送到任务队列中,然后队列消费进程从任务队列中获取任务执行。
  2. 一个队列是可以开启多个消费进程的,那么执行任务的效率是比单个进程顺序执行效率多很多的。
  3. 如果不需要等待所有任务的执行完成来获取结果的话,其实开启多个队列消费进程已经够了。
  4. 如果需要等待所有任务完成才返回结果的操作,比如在定时任务中需要读取Mysql的100条记录,去调用第三方的API,这个三方API很Low,调用一次需要2s,最终需要生成这100条记录的CSV文件。顺序执行至少需要200s才能完成, 如果有4个队列消费进程, 那么只需要50s左右即可完成。
  5. 主要问题在于如何解决进程间通信?因为需要知道这些子任务是否执行完,以及需要知道任务的执行结果。那么是否可以将使用redis来通信呢?用redis进行计数操作,每个任务执行完将计数器加1,每个任务的执行结果都放在redis的list/hash中,当计数器的总数等于任务总数的时候,就可以断定任务已经执行完成,然后取出redis存放的结果,生成csv文件。

实现

实际项目已在线上稳定跑了几个月了,在这里只贴伪代码展示一下实现思路,有兴趣的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值