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;
因为线程安全的实现,PHP的多线程开始运行后,无法再通过共享内存空间通信,线程也无法通过线程间通信复用,所以PHP的“线程池”并没有什么意义。扩展内自带的 `Pool` 类是一个对多线程分配管理的类