parallel 是 PHP ≥ 7.2.0 的并行并发扩展。从 parallel 1.2.0 开始,需要 PHP ≥ 8.0.0。
下面简要描述了 parallel 的核心概念,更多详细信息可以在手册的本节中找到。
一个 parallel\Runtime 代表一个 PHP 解释器线程。一个 parallel\Runtime 配置了一个可选的引导文件,该文件传递给 parallel\Runtime::__construct(),这通常是一个自动加载器或其他一些预加载例程:在执行任何任务之前,都会包含引导文件。
构建完成后,parallel\Runtime 将一直可用,直到它被关闭、终止或被 PHP 对象的正常作用域规则销毁。 parallel\Runtime::run() 允许程序员安排任务并行执行。一个 parallel\Runtime 有一个 FIFO 调度程序,任务将按照其调度的顺序执行。
parallel 在 parallel\Runtime 之上实现了一个函数式的高级 API,它提供了一个单一的函数入口点,用于使用自动调度执行并行代码: parallel\run()。
任务只是一个旨在并行执行的 Closure。该 Closure 可以包含几乎任何指令,包括嵌套的闭包。但是,有些指令在任务中是被禁止的
yield
按引用使用
声明类
声明命名函数
注意:
嵌套闭包可以 yield 或按引用使用,但不能包含类或命名函数声明。
注意:
任务可能包含的文件中没有任何指令是被禁止的。
使用 parallel\Future 访问任务的返回值,并公开用于取消任务的 API。
任务可以按参数调度,使用词法作用域变量(按值),并返回一个值(通过 parallel\Future),但这只能允许单向通信:它们允许程序员将数据发送到任务并从任务中检索数据,但不允许任务之间的双向通信。 parallel\Channel API 允许任务之间的双向通信,一个 parallel\Channel 是任务之间类似套接字的链接,程序员可以使用它来发送和接收数据。
parallel\Events API 实现了一个原生感觉(Traversable)事件循环和 parallel\Events::poll() 方法。它允许程序员使用通道和或 future 的集合。程序员只需将通道和 future 添加到事件循环中,可以选择使用 parallel\Events::setInput() 设置写入的输入,并进入 foreach:parallel 将在对象可用时读取和写入对象,并产生描述已发生操作的 parallel\Events\Event 对象。