基于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 相关文章推荐
关于document.cookie的使用javascript
Apr 11 Javascript
ajax 文件上传应用简单实现
Mar 03 Javascript
JQuery学习笔录 简单的JQuery
Apr 09 Javascript
AJAX跨域请求json数据的实现方法
Nov 11 Javascript
jquery实现图片灯箱明暗的遮罩效果
Nov 15 Javascript
js日期对象兼容性的处理方法
Jan 28 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
Dec 07 Javascript
浅谈js中对象的使用
Aug 11 Javascript
JS中图片压缩的方法小结
Nov 14 Javascript
微信小程序Flex布局用法深入浅出分析
Apr 25 Javascript
php结合js实现多条件组合查询
May 28 Javascript
JavaScript中的函数式编程详解
Aug 22 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配置心得包含MYSQL5乱码解决
2006/11/20 PHP
PHP 读取文件的正确方法
2009/04/29 PHP
php中判断数组是一维,二维,还是多维的解决方法
2013/05/04 PHP
php检测文件编码的方法示例
2014/04/25 PHP
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
jquery对表单操作2
2011/04/06 Javascript
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
Jquery EasyUI $.Parser
2017/06/02 jQuery
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
简单了解python数组的基本操作
2019/11/26 Python
Python 实现数组相减示例
2019/12/27 Python
python datetime处理时间小结
2020/04/16 Python
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
测试驱动开发的主要步骤是什么
2014/12/10 面试题
计算机专业职业规划
2014/02/28 职场文书
教师读书活动总结
2014/05/07 职场文书
项目经理任命书范本
2014/06/05 职场文书
小学教师读书活动总结
2014/07/08 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
劳模事迹材料范文
2014/12/24 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android