PHP-多线程

目录

一、线程与进程

1.1 线程

线程( thread ) 是操作系统进行运算调度的最小单位 。它是进程运作的单位。一个进程可以并发多个线程,而每个线程执行不同的任务。线程是进程的单位,可以理解成子任务。

1.2 进程

进程(process)简单理解一个运行的程序就是一个进程,对于操作系统来讲它就是一个正在执行的任务,而线程是子任务。

1.3 原理

多线程和多进程的并发,其实也不是真正意义上的并发,即使现在多是多核CPU,但任务的个数要远远大于cpu的核心数量,所以还是会。在同一个核心上执行多个任务。而 cpu的核心执行的指令都是顺序执行的。所以只能快速交替切换执行多个任务,由于切换的速度和cpu执行的速度过高。使我们感到多个进程同时在执行。

二、php中多线程的实现方式

2.1 简单说明

一开始我以为,php和js一样是单线程的根本就不支持多线程。后来发现php也是可以支持多线程的。
PHP 默认并不支持多线程,要使用多线程。需要安装 pthread 扩展,而要安装 pthread 扩展,必须使用 --enable-maintainer-zts 参数重新编译 PHP,这个参数是指定编译 PHP 时使用线程安全方式。

  • 多线程是让程序变得不安分的一个因素,在使用多线程之前,首先要考虑线程安全问题
  • 线程安全:线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的 共享变量,使程序功能正确完成。

    2.2 PHP实现多线程

  • php 从5.3 版本以后, 通过 pthread 扩展 可支持多线程。

  • PHP实现线程安全,主要是使用 TSRM 机制:对全局变量和静态变量进行了隔离,将全局变量和静态变量 给每个线程都复制了一份,各线程使用的都是主线程的一个备份,从而避免了变量冲突,也就 不会出现线程安全问题。
  • PHP 对多线程的封装保证了线程安全程序员不用考虑对全局变量加各种锁来避免读写冲突了,减少了出错的机会,写出的代码更加安全。但由此导致的是,子线程一旦开始运行,主线程便无法再 对子线程运行细节进行调整了,线程一定程度上失去了线程之间通过全局变量进行消息传递的能力。
  • 同时 PHP开启线程安全选项后,使用 TSRM 机制分配和使用变量时也会有额外的损耗,所以在不需要多线程的 PHP 环境中,使用 PHP 的 ZTS (非线程安全) 版本就好。
  • PHP 将线程 封装成了 Thread 类,线程的创建通过实例化一个线程对象来实现,由于类的封装性,变量的使用只能通过构造函数传入,而线程运算结果也需要通过类变量传出。
  • 下面介绍几个常用的 Thread 类方法:
  • run():此方法是一个抽象方法,每个线程都要实现此方法,线程开始运行后,此方法中的代码会自动执行;
  • start():在主线程内调用此方法以开始运行一个线程;
  • join():各个线程相对于主线程都是异步执行,调用此方法会等待线程执行结束;
  • kill():强制线程结束;
  • isRunning():返回线程的运行状态,线程正在执行run()方法的代码时会返回 true;
  1. 因为线程安全的实现,PHP的多线程开始运行后,无法再通过共享内存空间通信,线程也无法通过线程间通信复用,所以PHP的“线程池”并没有什么意义。扩展内自带的 `Pool` 类是一个对多线程分配管理的类