基于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 相关文章推荐
JavaScript 编程引入命名空间的方法与代码
Aug 13 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
Aug 09 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
Apr 23 Javascript
多引号嵌套的变量命名的问题
May 09 Javascript
控制台报错object is not a function的解决方法
Aug 24 Javascript
javascript数组详解
Oct 22 Javascript
D3.js 从P元素的创建开始(显示可加载数据)
Oct 30 Javascript
轻松实现JavaScript图片切换
Jan 12 Javascript
p5.js入门教程之小球动画示例代码
Mar 15 Javascript
自己动手封装一个React Native多级联动
Sep 19 Javascript
jQuery实现上下滚动公告栏详细代码
Nov 21 jQuery
JQuery常用选择器功能与用法实例分析
Dec 23 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
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
php preg_replace替换实例讲解
2013/11/04 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
jquery获取input的value问题说明
2010/08/19 Javascript
在javascript中对于DOM的加强
2013/04/11 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
2018/01/05 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
vue中的inject学习教程
2019/04/24 Javascript
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
python定时器使用示例分享
2014/02/16 Python
Python多线程编程简单介绍
2015/04/13 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
中软国际Java程序员笔试题
2014/07/19 面试题
外贸采购员求职的自我评价
2013/11/26 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
优秀学生获奖感言
2014/02/15 职场文书
应届生面试求职信
2014/07/02 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
检讨书范文
2019/04/16 职场文书
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL