基于pcntl的PHP进程池
想必大家都知道可以通过多进程或者多线程的方式实现异步。
PHP多进程编程当前主要有这几种方式,
1>基于pcntl实现多进程,这也是PHP自带的多进程玩法
2>Swoole自己修改PHP内核代码,从而实现多进程,这个看起来比较新
PHP基于pcntl封装的多进程或者进程池也有很多第三方库,今天分享下sinple_fork这个库,实现了多进程和进程池。
一,安装
用composer安装。
composer require jenner/simple_fork
二,使用
simple_fork这个库自带了很多内容,在此主要跟大家分享进程和进程池的使用,其他内容可以自行查看demo。
没有用过composer的朋友,需要根据自己的代码路径,导入autoload.php,在此略过。
需要在命令行下运行。
1,进程
使用步骤大致如下:
#1,任务是一个实现了Runnable接口的类,或者直接用callback也可以。
#2,初始化子进程Process,并把任务实例作为参数传递过去
#3,最后start开启子进程,wait用于等待子进程运行结束(否则会出现僵尸进程)。
用起来也很简单
use Jenner\SimpleFork\Runnable; use Jenner\SimpleFork\Process;
class Task implements Runnable
{ /**
* @return void
*/
public function run()
{
echo "I am a sub process" . PHP_EOL;
}
} $process = new Process(new Task());
$process->start();
$process->wait();
2,进程池
更多的时候,我们会用进程池去异步执行一些列任务。
进程池在初始化的时候,需要声名进程池的最大容量,超过该容量后新添加的进程都会放在队列,直到有新的空余空间释放出来,才会执行新增的任务。
同样需要用wait等待进程池内的所有子进程执行完毕,避免出现僵尸进程。
use Jenner\SimpleFork\Runnable; use Jenner\SimpleFork\Process;
use Jenner\SimpleFork\FixedPool;
class Task implements Runnable
{ /**
* @return mixed
*/
public function run()
{
sleep(10);
echo getmypid() . ':done' . PHP_EOL;
}
} $pool = new FixedPool(2);
$pool->execute(new Process(new Task()));
$pool->execute(new Process(new Task()));
$pool->execute(new Process(new Task())); $pool->wait();
还有其他功能,小伙伴们可以有兴趣的话可以自己去探索。
基于pcntl的PHP进程池的更多相关文章
- 基于concurrent.futures的进程池 和线程池
concurrent.futures:是关于进程池 和 线程池 的 官方文档 https://docs.python.org/dev/library/concurrent.futures.html 现 ...
- python并发编程之多进程(三):共享数据&进程池
一,共享数据 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合 通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求, 还可以扩展 ...
- python系列之 - 并发编程(进程池,线程池,协程)
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- Python 线程池,进程池,协程,和其他
本节内容 线程池 进程池 协程 try异常处理 IO多路复用 线程的继承调用 1.线程池 线程池帮助你来管理线程,不再需要每个任务都创建一个线程进行处理任务. 任务需要执行时,会从线程池申请线程,有则 ...
- Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块
进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. fro ...
- 进程间通信(队列、管道)、消费者模型和进程池(apply,apply_async,map)
一.队列(先进先出) 进程间通信:IPC(Inter-Process Communication) 队列是使用管道和锁定实现,所以Queue是多进程安全的队列,使用Queue可以实现多进程之间的数据传 ...
- 线程池、进程池(concurrent.futures模块)和协程
一.线程池 1.concurrent.futures模块 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 Pro ...
- Python 多进程和进程池
一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦 线程:是 ...
- python 管道、数据共享、进程池
一.管道(Pipe)(了解) (详情参考:https://www.cnblogs.com/clschao/articles/9629392.html) 进程间通信(IPC)方式二:管道(不推荐使用,了 ...
随机推荐
- 题解 洛谷 P5303 【[GXOI/GZOI2019]逼死强迫症】
可以先去考虑没有\(1 \times 1\)的砖块的情况,对于最后一个位置只有两种情况,一个是竖着用一块砖铺设\(2 \times 1\),另一个为横着用两块砖铺设\(2 \times 2\). 设没 ...
- springboot(二)配置SpringBoot支持自动装载Servlet
Servlet详解:https://blog.csdn.net/yanmiao0715/article/details/79949911 Web 技术成为当今主流的互联网 Web 应用技术之一,而 S ...
- windows系统远程修改密码
1.需求:公司需要短时间.批量修改一些windows系统的管理员密码: 2.准备工作: a.下载软件:链接:https://pan.baidu.com/s/1kV52DqE1_4siPuxS5Mosc ...
- Python后端日常操作之在Django中「强行」使用MVVM设计模式
扫盲 首先带大家了解一下什么是MVVM模式: 什么是MVVM?MVVM是Model-View-ViewModel的缩写. MVVM是MVC的增强版,实质上和MVC没有本质区别,只是代码的位置变动而已 ...
- ls -bash: ls: command not found
ls -bash: ls: command not found原因:在设置环境变量时,编辑profile文件没有写正确,导致在命令行下 ls等命令不能够识别.解决方案: export PATH=/us ...
- laravel5.5 安装
环境要求 PHP >= 7.0.0 PHP OpenSSL 扩展 PHP PDO 扩展 PHP Mbstring 扩展 PHP Tokenizer 扩展 PHP XML 扩展 通过 Larave ...
- Day11_基本搜索
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...
- Python三角函数
Python三角函数: 函数: ''' math.sin(x) 返回的x弧度的正弦值. math.asin(x) 返回x的反正弦弧度值. math.cos(x) 返回x的弧度的余弦值. math.ac ...
- Python break语句
Python break语句:当运行到 break 语句时,终止包含 break 的循环语句. 注:无论判断条件是否达到 False 或 序列是否遍历完都会停止执行循环语句和该 break 下的所有语 ...
- Excel绘制经典图表
1.柱形图 2.条形图 3.饼图---复合饼图 4.圆环图 5.组合图 设置不同的纵轴 6.漏斗图 其中:合计呈逐渐下降的趋势,可以用漏斗图进行展示! 绘制漏斗图首先需要构建辅助列,在插入图形的时候选 ...