基于PHP pthreads实现多线程代码实例

在某些情况,我们要使用 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个线程池,将他们都激活后,按照任务的数量来分配到每个线程上。

当一个线程完成他的工作后,继续拿到下个任务继续执行,直到所有任务都完成为止。

最后判断是否全部执行完了,并停止线程的运行,释放内存。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • PHP pthreads v3在centos7平台下的安装与配置操作方法

    本文实例讲述了PHP pthreads v3在centos7平台下的安装与配置操作方法.分享给大家供大家参考,具体如下: 我的centos版本是7.4.1708,php的版本是7.2.4(注意要是线程安全版),如下图所示: 首先我们在如下网址下载好pthreads的源码: http://pecl.php.net/package/pthreads 如:pthreads-3.1.6.tgz 1.解压.并进入目录 > tar xf pthreads-3.1.6.tgz > cd pthreads-3

  • PHP pthreads v3下同步处理synchronized用法示例

    本文实例讲述了PHP pthreads v3下同步处理synchronized用法.分享给大家供大家参考,具体如下: 之所以会用到同步,是因为如果多个线程中对同一个资源进行操作时,会发生混乱. 比如2个线程对变量进行加1操作,第1个线程还没来的及改写数据时,第2个线程就对变量进行操作了,那变量最终的结果就是未知的,这个时候就需要同步来进行控制了. 例子如下: <?php class Count extends Thread { public $cnt = 0; public function r

  • php pthreads多线程的安装与使用

    安装Pthreads 基本上需要重新编译PHP,加上 --enable-maintainer-zts 参数,但是用这个文档很少:bug会很多很有很多意想不到的问题,生成环境上只能呵呵了,所以这个东西玩玩就算了,真正多线程还是用Python.C等等 一.安装 这里使用的是 php-7.0.2 ./configure \ --prefix=/usr/local/php7 \ --with-config-file-path=/etc \ --with-config-file-scan-dir=/etc

  • PHP pthreads v3使用中的一些坑和注意点分析

    本文实例讲述了PHP pthreads v3使用中的一些坑和注意点.分享给大家供大家参考,具体如下: 一.子线程无法访问父线程的全局变量,但父线程可以访问子线程的变量 <?php class Task extends Thread { public $data; public function run() { global $num; var_dump($num); $this->data = 'abc'; //这是打印null var_dump($GLOBALS); $GLOBALS['te

  • PHP pthreads v3下worker和pool的使用方法示例

    本文实例讲述了PHP pthreads v3下worker和pool的使用方法.分享给大家供大家参考,具体如下: 有些人会想,明明用thread已经可以很好的工作了,为什么还要搞个worker和pool? 之所以要用到worker和pool还是因为效率,因为系统创建一个新线程代价是比较昂贵,每个创建的线程会复制当前执行的整个上下文. 尽可能的重用线程可以让我们的程序更高效. 一个简单的worker例子: <?php //创建自定义work类,给work取个名字,方便查看 class Work e

  • php使用pthreads v3多线程实现抓取新浪新闻信息操作示例

    本文实例讲述了php使用pthreads v3多线程实现抓取新浪新闻信息.分享给大家供大家参考,具体如下: 我们使用pthreads,来写一个多线程的抓取页面小程序,把结果存到数据库里. 数据表结构如下: CREATE TABLE `tb_sina` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `url` varchar(256) DEFAULT '' COMMENT 'url地址', `title` varchar

  • PHP pthreads v3下的Volatile简介与使用方法示例

    本文实例讲述了PHP pthreads v3下的Volatile简介与使用方法.分享给大家供大家参考,具体如下: 由于pthreads v3中引入了Threaded对象自动不变性的概念,所以当我们在构造函数中给成员设置为数组时,在其他地方就无法对成员再次改写了. 例子如下: <?php //pthreads v3引入了Threaded对象自动不变性的概念 //如果成员被设置成Threaded对象,那么它将不能被再次改写 //当然,这主要还是为了性能优化,但有时我们又需要改写成员,那么就需要继承自

  • 使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)

    我之前的文章中说过,大多数网站的性能瓶颈不在PHP服务器上,因为它可以简单地通过横向增加服务器或CPU核数来轻松应对(对于各种云主机,增加VPS或CPU核数就更方便了,直接以备份镜像增加VPS,连操作系统.环境都不用安装配置),而是在于MySQL数据库. 如果用 MySQL 数据库,一条联合查询的SQL,也许就可以处理完业务逻辑,但是,遇到大量并发请求,就歇菜了. 如果用 NoSQL 数据库,也许需要十次查询,才能处理完同样地业务逻辑,但每次查询都比 MySQL 要快,十次循环NoSQL查询也许

  • 基于PHP pthreads实现多线程代码实例

    在某些情况,我们要使用 PHP 进行重复的任务,但是只能完成单次,叠加起来的话执行时间会非常长,所以就要将任务分配到多个线程来分别执行. 但 PHP 在默认情况下是没有多线程的,必须要使用 pthreads PHP 扩展,这个扩展能真正的支持和实现多线程.多线程在处理重复性的循环任务,能够大大缩短程序执行时间. 要使用这个扩展,就必须使用线程安全的版本. 在编译 PHP 的时候, –enable-maintainer-zts ​这个选项是必须的,其他的根据自己的需求来添加 <?php error

  • Windows下使用Dev-C++开发基于pthread.h的多线程程序实例

    一.下载Windows版本的pthread 目前最新版本是:pthreads-w32-2-9-1-release.zip. 二.解压pthread到指定目录 我选择的目录是:E:\DEV-CPP\Pthread 完成后,该目录会多出三个文件夹:Pre-built.2,pthreads.2,QueueUserAPCEx. 三.配置Dev-C++编译选项 1)点击"工具"→"编译选项"→"目录"→"c++包含文件",浏览到刚才解压

  • 基于JavaScript伪随机正态分布代码实例

    这篇文章主要介绍了基于JavaScript伪随机正态分布代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在游戏开发中经常遇到随机奖励的情况,一般会采取先生成数组,再一个一个取的方式发随机奖励. 下面是js测试正态分布代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <ti

  • 基于python实现蓝牙通信代码实例

    这篇文章主要介绍了基于python实现蓝牙通信代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装和示例 linux下安装 sudo apt-get install python-pip libglib2.0-dev sudo pip install bluepy 官方示例 import btle class MyDelegate(btle.DefaultDelegate): def __init__(self, params): bt

  • 基于Java验证jwt token代码实例

    这篇文章主要介绍了基于Java验证jwt token代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 How to load public certificate from pem file..?地址 1.HS256对称加密 package jwt; import java.io.FileInputStream; import java.io.IOException; import java.security.KeyFactory; im

  • 基于python使用tibco ems代码实例

    这篇文章主要介绍了基于python使用tibco ems代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 TIBCO Enterprise Message Service 是一个消息服务器产品 完全支持JMS的通讯协议,在运行速度和消息吞吐量上表现非常出色, 对于Windows.Linux.Mac.AIX平台都提供支持 代码如下 #encoding=utf-8 import jpype jvmpath=r"C:\Program Files

  • Python批量启动多线程代码实例

    这篇文章主要介绍了python批量启动多线程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 建立一个线程池,并将某个线程放入进去 threadpool = [] th = threading.Thread(target=func_name, args=func_args) threadpool.append(th) 批量加入线程 for i in range(10): th = threading.Thread(target=func_

  • Java基于redis实现分布式锁代码实例

    为什么会有这个需求: 例如一个简单用户的操作,一个线程去修改用户状态,首先在在内存中读出用户的状态,然后在内存中进行修改,然后在存到数据库中.在单线程中,这是没有问题的.但是在多线程中由于读取,修改,写入是三个操作,不是原子操作(同时成功或失败),因此在多线程中会存在数据的安全性问题. 这个问题的话,就可以用分布式锁在限制程序的并发执行. 实现思路: 就是进来一个先占位,当别的线程进来操作的时候,发现有人占位了,就会放弃或者稍后再试. 占位的实现: 在redis中的setnx命令来实现,redi

  • 基于python实现简单网页服务器代码实例

    代码: hello.py #!/usr/bin/python # coding: utf-8 # hello.py def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return '<h1>Hello, %s!</h1>' % (environ['PATH_INFO'][1:] or 'web') server.py #!/usr/b

  • 基于Python计算圆周率pi代码实例

    一 计算公式: 二 实现代码 (1) import math from tqdm import tqdm import time total,s,n,t=0.0,1,1.0,1.0 while(math.fabs(t)>=1e-6): total+=t n+=2 s=-s t=s/n k=total*4 print("π值是{:.10f} 运行时间为{:.4f}秒".format(k,time.clock())) for i in tqdm(range(101)): print(

随机推荐