基于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 相关文章推荐
JS俄罗斯方块,包含完整的设计理念
Dec 11 Javascript
js中有关IE版本检测
Jan 04 Javascript
Javascript中的Array数组对象详谈
Mar 03 Javascript
Node.js的包详细介绍
Jan 14 Javascript
深入探讨JavaScript String对象
Mar 09 Javascript
jquery实现的树形目录实例
Jun 26 Javascript
Bootstrap项目实战之子栏目资讯内容
Apr 25 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
Nov 29 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
Dec 16 Javascript
详解为Bootstrap Modal添加拖拽的方法
Jan 05 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
Feb 07 Javascript
jQuery ajax - getScript() 方法和getJSON方法
May 14 jQuery
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
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
2015/06/25 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
再谈javascript注入 黑客必备!
2016/09/14 Javascript
javascript 动态脚本添加的简单方法
2016/10/11 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
Python脚本按照当前日期创建多级目录
2019/03/01 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
Python日志打印里logging.getLogger源码分析详解
2021/01/17 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
上海微创软件面试题
2012/06/14 面试题
EJB的几种类型
2012/08/15 面试题
仓库门卫岗位职责
2013/12/22 职场文书
周年庆典主持词
2014/04/02 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
导游词之南京中山陵
2019/11/27 职场文书
Python中的tkinter库简单案例详解
2022/01/22 Python
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫
Mysql调整优化之四种分区方式以及组合分区
2022/04/13 MySQL