交流群:462197261站长百科站长论坛热门标签收藏本站北冥有鱼 互联网前沿资源第一站 助力全行业互联网+
点击这里给我发消息
  • 当前位置:
  • PHP pthread拓展使用和注意点

    北冥有鱼 教程大全 2020-01-19 ,

    一. 线程的创建和使用

    1. Thread类

    基本的创建和使用:

    <?php
    
    //通过继承Thread类来实现自己的线程类MyThread
    
    class MyThread extends Thread{
    
      //重写构造函数
    
      function __construct(){
    
      }
    
      //重写run方法(运行的是子线程需要执行的任务)
    
      function run(){
    
      }
    
    }
    
    //对象的实例化和运行就和java一样
    
    $mt = new MyThread();
    
    $mt->start();

    当然,作为线程类,必须还有另外一些用于查询线程状态以及管理线程的方法

    <?php
    
    //获取创建线程的父线程id
    
    Thread::getCreatorId 
    
    //获取当前线程id
    
    Thread::getCurrentThreadId
    
    //获取当前线程引用
    
    Thread::getCurrentThread 
    
    //将线程加入检测
    
    Thread::join
    
    //查看线程是否被检测(是否被join)
    
    Thread::isJoined
    
    //强行杀死线程
    
    Thread::kill

    2.Worker类

    Worker类的父类是Thread类,因此基本用法和Thread一样。而Worker类相对于Thread类来说,增加了线程复用的功能(以降低创建销毁线程所耗费的资源),通常与Stackable类连用,也就是说worker类既可以当做线程使用,也可以当做任务的容器来使用,如:

    <?php
    
    class Task extends Stackable{
    
      function __construct($no){
    
        $this->no = $no;
    
      }
    
      function run(){
    
        echo "task{$this->no}:run".PHP_EOL;
    
      }
    
    }
    
    class MyWork extends Worker{
    
      function __construct(){
    
      }
    
      function run(){
    
      }
    
    }
    
    $t1= new Task(1);
    
    $t2= new Task(2);
    
    $t3= new Task(3);
    
    $my = new MyWork();
    
    $my->stack($t1);
    
    $my->stack($t2);
    
    $my->start();
    
    $my->stack($t3);

    最终输出:

    task1:run
    
    task2:run
    
    task3:run

    当然Worker类还有其他一些方法来用于父线程对其进行管理

    //获取还没执行的任务数量
    
    Worker::getStacked 
    
    //判断worker是否关闭
    
    Worker::isShutdown
    
    //判断worker是否在工作
    
    Worker::isWorking
    
    //关闭销毁worker
    
    Worker::shutdown
    
    //将任务压栈
    
    Worker::stack
    
    //将任务出栈(该api有问题,慎用)
    
    Worker::unstack

    二. PHP线程遇到的一些问题与注意点

    1.线程类的属性不能直接进行哈希表(数组)操作,如:

    //这样是无效的
    
    $this->var1["hello"] = "world"; 
    
    //改为
    
    $this->var1 = ["hello"=>"world"];

    为什么?因为线程类属性的赋值是通过序列化实现的,其本质是存储了序列化数据,因此不支持PHP常用直接操作哈希表(数组)的操作。

    2.线程类的属性不能是“闭包函数”

    原因:闭包函数不能序列化;因此,如果想在线程里用“回调函数”的话,那就放弃线程吧;

    3.线程对象开辟了php的第二空间

    (1)线程在创建之后,无法访问到父线程的变量,诸如$GLOBALS或global等用法都无法操作父线程的全局变量,这应该是考虑到了线程安全的问题;

    (2)但是父线程却能够访问子线程对象的内容;

    扩展内容

    php Pthread 多线程

    线程,有时称为轻量级进程,是程序执行的最小单元。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,它与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。每一个程序都至少有一个线程,那就是程序本身,通常称为主线程。线程是程序中一个单一的顺序控制流程。 在单个程序中同时运行多个线程完成不同的工作,称为多线程。

    <?php
     
    //实现多线程必须继承Thread类
    class test extends Thread {
      public function __construct($arg){
        $this->arg = $arg;
      }
     
      //当调用start方法时,该对象的run方法中的代码将在独立线程中异步执行。
      public function run(){
        if($this->arg){
          printf("Hello %s\n", $this->arg);
        }
      }
    }
    $thread = new test("World");
     
    if($thread->start()) {
      //join方法的作用是让当前主线程等待该线程执行完毕
      //确认被join的线程执行结束,和线程执行顺序没关系。
      //也就是当主线程需要子线程的处理结果,主线程需要等待子线程执行完毕
      //拿到子线程的结果,然后处理后续代码。
      $thread->join();
    }
    ?>

    我们把上述代码修改一下,看看效果

    <?php
     
    class test extends Thread {
      public function __construct($arg){
        $this->arg = $arg;
      }
      public function run(){
        if($this->arg){
          sleep(3);
          printf("Hello %s\n", $this->arg);
        }
      }
    }
    $thread = new test("World");
     
    $thread->start();
     
    echo "main thread\r\n";
    ?>

    我们直接调用start方法,而没有调用join。主线程不会等待,而是在输出main thread。子线程等待3秒才输出Hello World。


    广而告之:
    热门推荐:
    jQuery文字横向滚动效果的实现代码

    很多网站都有公告,并且都喜欢用横向滚动的方式来展现。最近自己用jQuery也写了文字横向滚动,实现了自定义滚动速度,鼠标经过时暂停的功能。 HTML代码如下: <div id="s" style="width:100px; position:relative; white-space:nowrap; overflow:hidden; height:20px;">···

    使用apply方法处理数组的三个技巧[译]

    apply方法 apply是所有函数都有的方法.它的签名如下: func.apply(thisValue, [arg1, arg2, ...]) 如果不考虑thisValue的影响,上面的调用等同于: func(arg1, arg2, ...) 也就是说,apply允许我们将一个数组"解开"成为一个个的参数再传递给调用函数.让我们分别看看apply使···

    jQuery NProgress.js加载进度插件的简单使用方法

    NProgress.js   说明:     NProgress是基于jquery的,且版本要 >1.8   下载地址:     https://github.com/rstacruz/nprogress   API:    NProgress.start() — 启动进度条     NProgress.set(0.4) — 将进度设置到具体的百分比位置     NProgress.i···

    react实现pure render时bind(this)隐患需注意!

    pure render 我就不多说了,附上我另一片文章链接 react如何性能达到最大化(前传) 不论你用不用immutable,只要你想达到pure render,下面值得你注意! 一天我和往常一样,开开心心得写着react,用着@pureRender, export default class extends Component { ... render() {···

    Mysql(MyISAM)的读写互斥锁问题的解决方法

    由于没办法在短期内增加读的服务器,所以采取对Mysql进行了一些配置,以牺牲数据实时性为代价,来换取所有服务器的生命安全。呵呵,具体相关调整以及思路如下: MyISAM在读操作占主导的情况下是很高效的。可一旦出现大量的读写并发,同InnoDB相比,MyISAM的效率就会直线···

    Windows平台实现PHP连接SQL Server2008的方法

    本文实例讲述了Windows平台实现PHP连接SQL Server2008的方法。分享给大家供大家参考,具体如下: 如果你需要和sql server通信需要到http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx自行下载微软提供的The SQL Server Driver for PHP。这是一个自解压文件,解压后会得···

    深入浅析Extjs中store分组功能的使用方法

    在项目实践的过程中,遇到需要将grid中数据根据某一字段分组的要求,当然,这个功能在api中有,在此列出来以供大家查找: 两点需要注意的地方: 1、在创建store时,需要设置groupField属性的值,即为需要分组的值 for example: JavaScript代码 Ext.define('Person', { extend···

    js分页工具实例

    本文实例讲述了js分页工具的用法。分享给大家供大家参考。具体实现方法如下: js代码部分: 复制代码 代码如下:/**   * 分页js   */  var Page;    (function(){          var Page = {vers···

    Mac系统下源码编译安装MySQL 5.7.17的教程

    1、下载并解压到:/Users/xiechunping/Softwares/mysql-5.7.17 下载地址:http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-5.7/mysql-boost-5.7.17.tar.gz 2、进入mysql-5.7.17,执行cmake cd ../mysql-5.7.17 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_···

    详解angular element()方法使用

    使用angular.element()获取一个dom的方法。 1.可以使用jquery的选择器 2.可以使用javascript的原生查找元素的方法 下面是angular.element()提供的方法 <input type="checkbox" class="input" /> <input type="text" class="input1" value="值" /> <div cl···