基于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延迟加载百度分享代码,提高网页速度
Jul 01 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
Sep 29 Javascript
javascript 数字格式化输出的实现代码
Dec 10 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
Oct 10 Javascript
JavaScript学习笔记之JS对象
Jan 22 Javascript
jquery中键盘事件小结
Feb 24 Javascript
Javascript创建类和对象详解
May 31 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
May 08 Javascript
webpack4 CSS Tree Shaking的使用
Sep 03 Javascript
微信小程序实现人脸识别登陆的示例代码
Apr 02 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
May 06 Javascript
微信小程序如何实现全局重新加载
Jun 05 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加速 eAccelerator配置和使用指南
2009/06/05 PHP
PHP strtotime函数详解
2009/12/18 PHP
PHP URL地址获取函数代码(端口等) 推荐
2010/05/15 PHP
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
将angular-ui的分页组件封装成指令的方法详解
2017/05/10 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
jquery获取select选中值的文本,并赋值给另一个输入框的方法
2018/08/21 jQuery
微信小程序实现无限滚动列表
2020/05/29 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
layui 上传文件_批量导入数据UI的方法
2019/09/23 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
python取余运算符知识点详解
2019/06/27 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
详解Python 最短匹配模式
2020/07/29 Python
Python3.9.1中使用split()的处理方法(推荐)
2021/02/07 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
企业管理培训感言
2014/01/27 职场文书
《小儿垂钓》教学反思
2014/02/23 职场文书
质量承诺书格式
2014/05/20 职场文书
大学生创业计划书
2014/08/14 职场文书
党员自我对照检查材料
2014/08/19 职场文书
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
检讨书范文
2019/04/16 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
详解MongoDB的条件查询和排序
2021/06/23 MongoDB
服务器nginx权限被拒绝解决案例
2022/09/23 Servers