想必大家都知道可以通过多进程或者多线程的方式实现异步。

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进程池的更多相关文章

  1. 基于concurrent.futures的进程池 和线程池

    concurrent.futures:是关于进程池 和 线程池 的 官方文档 https://docs.python.org/dev/library/concurrent.futures.html 现 ...

  2. python并发编程之多进程(三):共享数据&进程池

    一,共享数据 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合 通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求, 还可以扩展 ...

  3. python系列之 - 并发编程(进程池,线程池,协程)

    需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...

  4. Python 线程池,进程池,协程,和其他

    本节内容 线程池 进程池 协程 try异常处理 IO多路复用 线程的继承调用 1.线程池 线程池帮助你来管理线程,不再需要每个任务都创建一个线程进行处理任务. 任务需要执行时,会从线程池申请线程,有则 ...

  5. Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块

    进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. fro ...

  6. 进程间通信(队列、管道)、消费者模型和进程池(apply,apply_async,map)

    一.队列(先进先出) 进程间通信:IPC(Inter-Process Communication) 队列是使用管道和锁定实现,所以Queue是多进程安全的队列,使用Queue可以实现多进程之间的数据传 ...

  7. 线程池、进程池(concurrent.futures模块)和协程

    一.线程池 1.concurrent.futures模块 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 Pro ...

  8. Python 多进程和进程池

    一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦 线程:是 ...

  9. python 管道、数据共享、进程池

    一.管道(Pipe)(了解) (详情参考:https://www.cnblogs.com/clschao/articles/9629392.html) 进程间通信(IPC)方式二:管道(不推荐使用,了 ...

随机推荐

  1. Python的telnetlib模块使用

    telnetlib模块的常用接口 telnetlib.Telnet(host, port, timeout) # 登录 write() # 输入命令 read_until(match) # 读出响应, ...

  2. Just test it!!软件测试测起来!!

    (图片: josh@unsplash,字数:700,时间:1分钟) (一) 一切的软件质量保障活动,归根结底,就两种类型. 一种是基于代码执行的,一种是不基于代码执行的. 测试之于肉眼自查.静态检查. ...

  3. wpf中实现快捷键

    <Window.InputBindings> <KeyBinding Gesture="Ctrl+Alt+Q" Command="{Binding Yo ...

  4. MySQL(三)视图

    视图:view,是一种有结构(有行有列)但是没有结果(结构中不真实的存放数据)的虚拟表,虚拟表的结构来源不是自己定义,而是从对应的基表中产生(视图的数据来源): 视图意义: 1.视图可以节省SQL语句 ...

  5. 没想到 Hash 冲突还能这么玩,你的服务中招了吗?

    背景 其实这个问题我之前也看到过,刚好在前几天,洪教授在某个群里分享的一个<一些有意思的攻击手段.pdf>,我觉得这个话题还是有不少人不清楚的,今天我就准备来“实战”一把,还请各位看官轻拍 ...

  6. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU特性那些事(1)- 概览

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的基本特性. 恩智浦半导体于2017年开始推出的i.MX RT系列重新定义了MCU,其第一款芯片i. ...

  7. 浅谈Redis未授权访问漏洞

    Redis未授权访问漏洞 Redis是一种key-value键值对的非关系型数据库 默认情况下绑定在127.0.0.1:6379,在没有进行采用相关的策略,如添加防火墙规则避免其他非信任来源ip访问等 ...

  8. ken桑带你读源码之scrapy downloadermiddlewares

    downloadermiddlewares  文件夹是下载中间件 其中  process_request   还没请求时的处理函数 process_response  请求之后的处理函数 chunke ...

  9. matplotlib基础汇总_03

    四图 直方图 [直方图的参数只有一个x!!!不像条形图需要传入x,y] hist()的参数 bins 可以是一个bin数量的整数值,也可以是表示bin的一个序列.默认值为10 normed 如果值为T ...

  10. PHP array_slice() 函数

    实例 从数组的第二个元素开始取出,并返回直到数组末端的所有元素: <?php$a=array("red","green","blue" ...