PHP Conference Japan 2024

理念

本节包含编写并行代码的重要理念以及有关并行内部实现的一些详细信息。

不要通过共享内存来通信;相反,通过通信来共享内存。

这种理念在并行中得到了体现,其起源于 Go,Go 是目前编写并行代码最受赞誉(即使没有广泛使用)的平台之一。Go 程序员必须努力达到这一理想:PHP 和并行会为程序员完成所有艰苦的工作,并且默认如此。

在其他语言中发现的传统线程模型中,线程通常仅通过它们在同一地址空间中运行的事实来相互通信。程序员必须部署互斥、条件变量和其他低级线程或同步原语,以确保状态和一致性的正确通信。

当传统模型被反转时,这意味着线程仅作为通信结果共享内存(例如,变量通过 Channel 传递)。

当并行以任何方式将变量从一个线程传递到另一个线程时——任务参数、通过 Future 返回以及 Channel——它都是按值传递的。在除无缓冲通道之外的所有情况下,变量也会被缓冲,以便在它被传递到任何线程中使用之前,它不会改变(或被销毁)。通过通道的无缓冲读取是线程直接读取另一个线程分配的内存的唯一实例,它可以安全地这样做,因为拥有内存的线程会在继续操作之前等待读取完成,并且不拥有内存的线程按值读取。当两个线程都继续执行时,它们不再共享内存。

这使得编写和推理并行代码比传统的线程模型更容易。这意味着程序员不需要考虑线程可能并发地操作数据,因为这是不可能的。

这也使得 PHP 成为基于 CSP(通过通道进行消息传递)实现并行并发 API 的完美平台,因为 PHP 本身就是无共享的——PHP 线程默认在其自己的虚拟地址空间中运行,因此只能通过通信共享内存。

数据应该有一个明确的单一所有者

在第一次接触 CSP 模型时,精通传统线程模型的程序员可能会发现自己正在寻找并发数据结构,因为这是他们习惯使用的:他们传递共享对象进行操作。

当涉及到 CSP 模型时,不需要数据结构被多个任务共享,事实上,如果不共享会更简单。数据应该由单个任务拥有,对该数据结构的更改(或操作)应该通过通道进行通信,并由数据的所有者执行,更改(或操作)的成功、失败或结果(状态)被传回。

再次强调,PHP 的无共享特性和并行的按值复制特性有助于程序员实现这个目标,数据永远不会意外共享,只会在通信的结果下共享。

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top