swoft2 自定义用户进程来定期执行用户自定义任务
swoft2 支持进程池解决多进程并发执行用户自定义任务

swoft2 进程详解

多进程程序设计能解决很多有意义的问题,程序的主进程运行核心任务,一些辅助进程解决一些例如消息队列的处理,后台定期执行的任务处理,文件监控,定期日志上报等相关功能.每个进程都有独立的上下文,进程之间互不干扰.

功能的相关配置选项

  1. 用户进程的配置一般需要在 bean.php 里注册,系统会自动加载用户配置的自定义进程
  2. 进程池的配置也需要在 bean.php 配置进程池配置项,但进程池不会自动加载,需要手动执行命令来启动用户进程

用户进程配置简单示例

修改 bean.php

'httpServer' => ['class' => HttpServer::class,'port' => 18306,'listener' => ['rpc' => bean('rpcServer')],'process' => ['crontab' => bean(CrontabProcess::class)'log' => bean(\App\Process\LogProcess::class)],],

上面的配置是 WEB服务器 的应用配置 如果是 WebSocket服务器 写在wsServer配置项里,定义 process 属性就好.

注意process的值是一维数组,其中key你可以自己定义,只要合法且不重复即可,值则为你定义的进程类,请用工厂函数 bean 加载.

进程池的配置简单示例

修改 bean.php

​​​​

'processPool' => ['class' => \Swoft\Process\ProcessPool::class,'workerNum' => 12]

上面的配置定了进程池,且分配了12个可用工作进程,实际生产中根据你的项目需求自行修改配置项.

进程 workerid 的初始值是0,所以这里的 workerid 有效访问是0-11,请注意

简单的示例

用户进程代码预览

namespace App\Process;use Swoft\Bean\Annotation\Mapping\Bean;use Swoft\Log\Helper\CLog;use Swoole\Coroutine;use Throwable;use Swoft\Process\Process;use Swoft\Process\UserProcess;/*** Class LogProcess** @since 2.0** @Bean()*/class LogProcess extends UserProcess{/*** @param Process $process** @throws Throwable*/public function run(Process $process): void{$process->name('swoft-monitor'); //设置用户进程名while (true) {CLog::info('用户进程,每隔3秒输出一次');//需要处理的工作Coroutine::sleep(3);//休眠3秒}}}
  • 注意事项
  1. 自定义进程类需要打上 Bean 注解
  2. 用自定义进程类必须继承 Swoft\Process\UserProcess
  3. 用户自定义进程类的 run 方法是具体的任务执行代码
  4. 用户进程需要while循环来防止进程执行完毕后退出
  5. 休眠函数请使用 Coroutine::sleep(3) 参数根据项目实际情况配置,单位是秒.支持传小数,如果传入参数0.5,则代表每 500ms 执行一次
  6. 在run方法里不使用 while(true) 而使用 \Swoft\Timer::tick ,也是可以的,但tick更多的用于解决周期性任务,该函数需要维护更多的调用栈,并且触发 swoft 的内置事件,所以它更消耗性能,一般在执行频率要求不高的场景下使用,如果一些执行频率较高的任务推荐使用 while(true)

控制台打印

进程池代码预览​​​​​​​

namespace App\Process;use Swoft\Log\Helper\CLog;use Swoft\Process\Annotation\Mapping\Process;use Swoft\Process\Contract\ProcessInterface;use Swoole\Coroutine;use Swoole\Process\Pool;use Throwable;/*** Class Worker2Process* @since 2.0* @Process(workerId={0,1})*/class Worker2Process implements ProcessInterface{/*** @param Pool $pool* @param int $workerId* @throws Throwable*/public function run(Pool $pool, int $workerId): void{while (true) {CLog::info('worker-' . $workerId.' context='.context()->getWorkerId());Coroutine::sleep(3);}}}

注意事项

  1. 进程池进程类需要打上 Process 注解 且参数是 workerId 值为分配的进程池work进程的id数组.
  2. 进程池进程类需要实现 Swoft\Process\Contract\ProcessInterface 接口.
  3. 进程池 Process 注解的 workerId 不是越多越好,需要根据你的需要设置,设置的越多占用的内存越多.
  4. 每个 workerid 只允许分配一次,如果分配多个系统会抛出异常.
  5. workerid的取值范围是 0 到 bean.php 配置的 workerNum-1 本文的例子是 0-11

启动说明

前台启用进程

php bin/swoft process:start

后台启动进程

php bin/swoft process:start -d

重启所有 worker 进程

php bin/swoft process:reload

重新启动

php bin/swoft process:restart

停止服务

php bin/swoft process:stop

控制台打印

swoft2 小白教程系列-进程篇相关推荐

  1. Java小白入门系列 第一篇 写在前面

    2018年8月30日  22:00:17 郑州  多云 Sue Java小白入门系列 第一篇  写在前面 写在前面: 首先声明一下,本人也是正在学Java,并不是多么专业人士,只是最近受老师的启发,所 ...

  2. 九、给小白看的第二篇Python基础教程

    本文是第二篇 @Author:Runsen @Date:Writern By 2019/04/15 and supplied By 2020/3/31 @公众号:Python之王 本系列Python基 ...

  3. nas java_小白入门NAS—快速搭建私有云教程系列(一)

    什么是NAS 在日常的工作生活中,我们有大量的资料.文件需要存储在电脑或者其他终端设备中,但是这种方式需要电脑配备高容量的硬盘,而且需要随时随地的带着,这样是不是很麻烦? 那么,今天,我来介绍一种家庭 ...

  4. matlab 积分进阶教程,最适合小白的matlab教程系列_进阶系列二之微积分

    微积分篇 更多文章参考 符号变量 极限问题 求导数 求导数----偏导数 积分--符号解 积分数值解 多重积分 级数求和 泰勒级数展开 常微分方程 更多文章参考 最适合小白的matlab教程系列_基础 ...

  5. APICloud之小白图解教程系列(一):认识APICloud

    篇头语: 非常感谢APICloud官方给我版主职位,每天都看到很多朋友提出很多问题,我就借此机会写了一系列的教程,帮助大家从小白到高手之路.系列名称:<APICloud之小白图解教程系列> ...

  6. 最适合小白的matlab教程系列_进阶系列二之微积分

    微积分篇 更多文章参考 符号变量 极限问题 求导数 求导数----偏导数 积分--符号解 积分数值解 多重积分 级数求和 泰勒级数展开 常微分方程 更多文章参考 最适合小白的matlab教程系列_基础 ...

  7. 【Lua 教程系列第 2 篇】什么是 Lua 语言?

    这是[Lua 教程系列第 2 篇],如果觉得有用的话,欢迎关注专栏. 一:Lua 语言简介 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而 ...

  8. OpenCV学习系列教程第五篇:测试和提高代码的效率

    Opencv-Python学习系列教程第五篇 来自opencv-python官方学习文档,本人谨做翻译和注释,以及一些自己的理解 本文由作者翻译并进行代码验证,转载请注明出处~ 官方文档请参阅:htt ...

  9. pytorch 指定卡1_[原创][深度][PyTorch] DDP系列第一篇:入门教程

    引言 DistributedDataParallel(DDP)是一个支持多机多卡.分布式训练的深度学习工程方法.PyTorch现已原生支持DDP,可以直接通过torch.distributed使用,超 ...

最新文章

  1. 【前端】JavaScript
  2. 【多视图几何】TUM 课程 第2章 刚体运动
  3. 22个国外电子商务系统
  4. java+读取source资源_如何从JavaJAR文件中读取资源文件?
  5. 电子与通信工程专硕考分_考研专业学校推荐之电子与通信工程~
  6. c语言数组和字符串编程题,C语言中的字符数组和字符串详解
  7. 【数据科学】探索性数据分析
  8. Linux mysql 主从复制
  9. hdlbits刷题记录
  10. HTML强制关机,如何强制关机【处置技巧】
  11. 基于循环神经网络的格兰杰因果网络重构
  12. 美团校招实习生面试一面
  13. 计算机科学技术考研录取人数,2021清华计算机科学与技术考研招生人数、考试科目、复试科目、分数线录取名单...
  14. 【育儿】计算宝宝的生辰八字
  15. JULIA学习材料合集
  16. Android证书生成(android studio)
  17. iphone手机上三个麦克风作用
  18. 重构笔记——提炼函数
  19. Docker镜像的优化
  20. 3.14.43 cpsw网卡驱动部分分析

热门文章

  1. ADB 最新调试工具
  2. java实现计算机界面
  3. DB2数据库安装与配置
  4. 四平方和定理 leetcode279 c++
  5. 汉诺塔问题(Tower of Hanoi)
  6. java获取时间的各种风格_Java8新特性之新日期API
  7. 虚拟IP注册Nacos的问题
  8. 简述MACD指标以及它的组成MACD、MACDsignal和MACDhist
  9. ALM算法(增广拉格朗日法)
  10. WebRTC系列-Qos系列之发送NACK