基于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中单选框和复选框获取值的方式
Nov 06 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
Apr 26 Javascript
jquery实现checkbox全选全不选的简单实例
Dec 31 Javascript
JS基于面向对象实现的放烟花效果
May 07 Javascript
AngularJS指令与指令之间的交互功能示例
Dec 14 Javascript
JS中parseInt()和map()用法分析
Dec 16 Javascript
概述一个页面从输入URL到页面加载完的过程
Dec 16 Javascript
基于AGS JS开发自定义贴图图层
Mar 31 Javascript
JS实现访问DOM对象指定节点的方法示例
Apr 04 Javascript
Vue项目中使用jsonp抓取跨域数据的方法
Nov 10 Javascript
Vue父子之间值传递的实例教程
Jul 02 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
Jan 11 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 如何获取二维数组中某个key的集合
2014/06/03 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
JavaScript是如何实现继承的(六种方式)
2016/03/31 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
Vue中的v-for循环key属性注意事项小结
2018/08/12 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
推荐几个不错的console调试技巧实现
2019/12/20 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
简单介绍Python中的RSS处理
2015/04/13 Python
Python reduce()函数的用法小结
2017/11/15 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
关于Pytorch的MLP模块实现方式
2020/01/07 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
党员干部承诺书范文
2014/03/25 职场文书
导游词之吉林吉塔
2019/11/11 职场文书
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android