基于PHP pthreads实现多线程代码实例


Posted in Javascript onJune 24, 2020

在某些情况,我们要使用 PHP 进行重复的任务,但是只能完成单次,叠加起来的话执行时间会非常长,所以就要将任务分配到多个线程来分别执行。

但 PHP 在默认情况下是没有多线程的,必须要使用 pthreads PHP 扩展,这个扩展能真正的支持和实现多线程。多线程在处理重复性的循环任务,能够大大缩短程序执行时间。

要使用这个扩展,就必须使用线程安全的版本。

在编译 PHP 的时候, ?enable-maintainer-zts ​这个选项是必须的,其他的根据自己的需求来添加

<?php

error_reporting(E_ALL);
class vote extends Thread {
  public $res  = '';
  public $url  = array();
  public $name  = '';
  public $runing = false;
  public $lc   = false;

  public function __construct($name) {
    $this->res  = '暂无,第一次运行.';
    $this->param  = 0;
    $this->lurl  = 0;
    $this->name  = $name;
    $this->runing = true;
    $this->lc   = false;
  }

  public function run() {
    while ($this->runing) {

      if ($this->param != 0) {
        $nt     = rand(1, 10);
        echo time()."线程[{$this->name}]收到任务参数::{$this->param},需要{$nt}秒处理数据.n";
        $this->res  = rand(100, 999);
        //sleep($nt);
        $this->lurl = $this->param;
        $this->param  = '';
      } else {
        echo time()."线程[{$this->name}]等待任务..n";
      }
      sleep(1);
    }
  }
}

//这里创建线程池.
$pool[] = new vote('a');
$pool[] = new vote('b');
$pool[] = new vote('c');
$pool[] = new vote('d');
$pool[] = new vote('e');
$pool[] = new vote('f');
$pool[] = new vote('g');
$pool[] = new vote('h');
$pool[] = new vote('i');
$pool[] = new vote('j');

//启动所有线程,使其处于工作状态
foreach ($pool as $w) {
  $w->start();
}

//派发任务给线程
for ($i = 0; $i < 100; $i++) {
  $worker_content = rand(10, 99);
  while (true) {
    foreach ($pool as $worker) {
      //参数为空则说明线程空闲
      if ($worker->param=='') {
        $worker->param = $worker_content;
        echo "[{$worker->name}]线程空闲,放入参数{$worker_content},上次参数[{$worker->lurl}]结果[{$worker->res}].n";
        break 2;
      }
    }
    sleep(1);
  }
}
echo "所有线程派发完毕,等待执行完成.n";

//等待所有线程运行结束
while (count($pool)) {
  //遍历检查线程组运行结束
  foreach ($pool as $key => $threads) {
    if ($worker->param=='') {
      echo "[{$threads->name}]线程空闲,上次参数[{$threads->lurl}]结果[{$threads->res}].n";
      echo "[{$threads->name}]线程运行完成,退出.n";
      //设置结束标志
      $threads->runing = false;
      unset($pool[$key]);
    }
  }
  echo "等待中...n";
  sleep(1);
}
echo "所有线程执行完毕.n";
?>

这段代码首先是新建了10个线程池,将他们都激活后,按照任务的数量来分配到每个线程上。

当一个线程完成他的工作后,继续拿到下个任务继续执行,直到所有任务都完成为止。

最后判断是否全部执行完了,并停止线程的运行,释放内存。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
c#和Javascript操作同一json对象的实现代码
Jan 17 Javascript
jQuery中parentsUntil()方法用法实例
Jan 07 Javascript
jQuery中prev()方法用法实例
Jan 08 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
Nov 11 Javascript
BootStrap文件上传样式超好看【持续更新】
May 10 Javascript
AngularJs表单校验功能实例代码
Feb 09 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
Apr 11 Javascript
BootStrap中的Fontawesome 图标
May 25 Javascript
JS实现快递单打印功能【推荐】
Jun 21 Javascript
vue组件(全局,局部,动态加载组件)
Sep 02 Javascript
小程序登录态管理的方法示例
Nov 13 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
May 21 Javascript
js实现html滑动图片拼图验证
Jun 24 #Javascript
微信小程序的引导页实现代码
Jun 24 #Javascript
微信小程序仿抖音短视频切换效果的实例代码
Jun 24 #Javascript
微信小程序swiper组件实现抖音翻页切换视频功能的实例代码
Jun 24 #Javascript
javascript实现前端成语点击验证优化
Jun 24 #Javascript
vue各种事件监听实例(小结)
Jun 24 #Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
Jun 24 #Javascript
You might like
巧用php中的array_filter()函数去掉多维空值的代码分享
2012/09/07 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
2014/05/12 Javascript
node.js中的favicon.ico请求问题处理
2014/12/15 Javascript
JSONP之我见
2015/03/24 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
javascript实现网站加入收藏功能
2015/12/16 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
python添加模块搜索路径方法
2017/09/11 Python
python读取和保存视频文件
2018/04/16 Python
python通过伪装头部数据抵抗反爬虫的实例
2018/05/07 Python
Python面向对象之类的内置attr属性示例
2018/12/14 Python
总结python中pass的作用
2019/02/27 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
django框架两个使用模板实例
2019/12/11 Python
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
物理学专业求职信
2014/07/04 职场文书
小学生春游活动方案
2014/08/20 职场文书
小学德育工作总结2015
2015/05/12 职场文书
大学军训通讯稿
2015/07/18 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
java泛型通配符详解
2021/07/25 Java/Android