简介

pthreads 是一个面向对象的 API,它提供了在 PHP 中进行多线程所需的所有工具。PHP 应用程序可以创建、读取、写入、执行和与线程、工作线程和线程对象进行同步。

警告

此扩展被认为是未维护的,并且已停止维护。

提示

考虑使用 parallel 作为替代。

警告

pthreads 扩展不能在 Web 服务器环境中使用。因此,PHP 中的线程仅限于基于 CLI 的应用程序。

警告

pthreads (v3) 只能与 PHP 7.2+ 一起使用:这是因为 ZTS 模式在 7.0 和 7.1 中不安全。

Threaded 类是使 pthreads 能够运行的功能的基础。它公开同步方法和一些对程序员有用的接口。

Thread 类允许通过简单地扩展它并实现 run 方法来创建线程。任何成员都可以被具有对线程的引用的任何上下文写入和读取。任何上下文也可以执行任何公共和受保护的方法。当从创建它的上下文中调用实现的 Thread::start() 方法时,run 方法的主体将在一个单独的线程中执行。只有创建线程的上下文才能启动和加入它。

Worker 类具有持久状态,并且将在从 Thread::start()(继承的方法)调用时一直可用,直到对象超出范围或显式关闭(通过 Worker::shutdown())。任何具有对工作线程对象的引用的上下文都可以将任务添加到工作线程(通过 Worker::stack()),这些任务将在工作线程中在一个单独的线程中执行。工作线程对象的 run 方法将在工作线程堆栈上的任何对象之前执行,允许初始化要执行的对象可能需要的资源。

Pool 类用于创建一个工作线程组,以便将 Threaded 对象分配到它们之中。它是使用 PHP 应用程序中的多个线程最简单、最有效的方式。

注意

Pool 类没有扩展 Threaded 类,因此基于池的对象被认为是普通的 PHP 对象。因此,它的实例不应在不同的上下文之间共享。

Volatile 类是 pthreads v3 的新增功能。它用于表示 Threaded 类可变的 Threaded 属性(因为这些属性现在默认情况下是不可变的)。它也用于在 Threaded 上下文中存储 PHP 数组。

同步是在线程化时一项重要的能力。pthreads 创建的所有对象都具有内置的同步功能,它以 Threaded::wait()Threaded::notify() 的形式(这将使 Java 程序员熟悉)。在对象上调用 Threaded::wait() 将导致上下文等待另一个上下文在同一对象上调用 Threaded::notify()。这种机制允许在 PHP 中 Threaded 对象之间进行强大的同步。

注意

任何旨在用在应用程序多线程部分中的对象都应该扩展 Threaded

数据存储:根据经验,任何可以序列化的数据类型都可以用作 Threaded 对象的成员,它可以从具有对 Threaded 对象的引用的任何上下文进行读取和写入。并非所有类型的数据都以序列化方式存储,基本类型以其真实形式存储。复杂类型、数组和非 Threaded 的对象以序列化方式存储;它们可以通过具有对 Threaded 对象的引用的任何上下文从 Threaded 对象进行读取和写入。除了 Threaded 对象之外,用于设置 Threaded 对象成员的任何引用都与 Threaded 对象中的引用分开;相同数据可以随时通过具有对 Threaded 对象的引用的任何上下文直接从 Threaded 对象读取。

静态成员:当创建一个新的上下文(线程或工作线程)时,它们通常会被复制,但具有内部状态的资源和对象会被取消(出于安全原因)。这使它们能够充当一种线程本地存储。例如,在启动上下文时,如果一个类的静态成员包括数据库服务器的连接信息以及连接本身,那么只有简单的连接信息会被复制,而不是连接。允许新上下文以与创建它的上下文相同的方式启动连接,并将连接存储在相同的位置,而不会影响原始上下文。

注意

当执行 print_r、var_dump 和其他对象调试函数时,它们不包含递归保护。

注意:

资源:在 PHP 中定义资源的扩展和功能完全没有为这种环境做好准备;pthreads 为资源在上下文之间共享做了准备,但是对于大多数类型的资源,它应该被认为是不安全的。在上下文之间共享资源时,应格外小心和谨慎。

注意

在 pthreads 执行的环境中,为了提供稳定的环境,一些限制和局限性是必要的。

添加注释

用户贡献的注释 1 条注释

26
Anon
4 年前
pthreads 和 parallel 的创建者 Joe Watkins 在今年(2019 年)的 2 月宣布,由于架构缺陷,pthreads 在 PHP 7.4 之后将不再维护。

未来,应使用 parallel 而不是 pthread。

公告
https://github.com/krakjoe/pthreads/issues/929#issue-410636734
To Top