基于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 相关文章推荐
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
Jul 31 Javascript
js获得地址栏?问号后参数的方法
Aug 08 Javascript
jQuery中filter()方法用法实例
Jan 06 Javascript
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
Dec 23 Javascript
JavaScript语言精粹经典实例(整理篇)
Jun 07 Javascript
jQuery实现区域打印功能代码详解
Jun 17 Javascript
JS操作xml对象转换为Json对象示例
Mar 25 Javascript
基于Vue实例生命周期(全面解析)
Aug 16 Javascript
Node.js 使用axios读写influxDB的方法示例
Oct 26 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
Nov 29 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
Dec 29 Javascript
Openlayers实现距离面积测量
Sep 28 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关联数组的10个操作技巧
2013/01/21 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
PHP解决中文乱码
2017/04/28 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
javascript 二维数组的实现与应用
2010/03/16 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
jQuery实现本地存储
2020/12/22 jQuery
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
Python中内建函数的简单用法说明
2016/05/05 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
Python3 中文文件读写方法
2018/01/23 Python
python的pip安装以及使用教程
2018/09/18 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
Nike西班牙官方网站:Nike.com (ES)
2017/10/30 全球购物
次世代生活态度:Hypebeast
2018/07/05 全球购物
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
学生党员的自我评价范文
2014/03/01 职场文书
林肯就职演讲稿
2014/05/19 职场文书
婚纱店策划方案
2014/05/22 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
浅谈Python类的单继承相关知识
2021/05/12 Python
详解Python中的for循环
2022/04/30 Python