基于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 相关文章推荐
优化网页之快速的呈现我们的网页
Jun 29 Javascript
jquery之empty()与remove()区别说明
Sep 10 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
Sep 02 Javascript
js读取被点击次数的简单实例(从数据库中读取)
Mar 07 Javascript
jQuery 获取/设置/删除DOM元素的属性以a元素为例
May 23 Javascript
jQuery中offsetParent()方法用法实例
Jan 19 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
Oct 15 Javascript
谈谈我对JavaScript DOM事件的理解
Dec 18 Javascript
浅谈bootstrap源码分析之tab(选项卡)
Jun 06 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
Jul 05 Javascript
js显示动态时间的方法详解
Aug 20 Javascript
js中如何完美的解析数据
Mar 18 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实现的简单美国商品税计算函数
2015/07/13 PHP
php用户注册信息验证正则表达式
2015/11/12 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
2016/10/13 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
jquery 学习之二 属性(类)
2010/11/25 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
为输入框加入数字js校验代码分享
2017/11/02 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
php使用递归与迭代实现快速排序示例
2014/01/23 Python
Python 字典(Dictionary)操作详解
2014/03/11 Python
部署Python的框架下的web app的详细教程
2015/04/30 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
Python中with及contextlib的用法详解
2017/06/08 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
Python图像处理之识别图像中的文字(实例讲解)
2018/05/10 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
使用Python实现牛顿法求极值
2020/02/10 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
质检的岗位职责
2013/11/17 职场文书
校运会入场式解说词
2014/02/10 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
施工安全责任书范本
2014/07/24 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python