在 SageMath 中,我至少见过以下两个问题的案例。我们有一个函数,它构造并返回来自同一类的元素,并且当顺序调用它时,它会按预期工作。但是,当通过
multiprocessing
功能并行调用此函数时,返回的元素恰好来自底层类的不同实例。
SageMath 的 issue #37278 中描述了最近的示例。另一种是 在 Ask.sagemath.org 上描述的。
并非每个类都会在
multiprocessing
下以这种方式失败,无论元素是顺序构造还是并行构造,有些类都保持“稳定”。从上面链接的问题 #37278 来看,SageMath 的 Permutations
类是稳定的,而 PermutationGroup
类则不稳定。那些不稳定的人似乎错过了他们的定义。
问:类的基本属性是什么,使其在
的使用下保持稳定?multiprocessing
Python 类在多处理下保持“稳定”的一个基本属性是不变性。
在多处理中,当您生成多个进程时,每个进程都会获得自己单独的内存空间。如果您在进程之间传递可变类的实例,则由于不同进程的同时修改,存在数据损坏或意外行为的风险。
为了确保稳定性并防止多处理中出现问题,使用不可变对象或确保使用锁、信号量或队列等多处理同步原语正确同步共享数据结构至关重要。不可变对象在创建后无法修改,因此它们本质上可以安全地在进程之间共享,而不存在并发修改问题的风险。
Python 中的不可变对象包括元组、字符串、整数和冻结集。通过使用这些类型或创建您自己的不可变类,您可以确保您的数据在多处理环境中的多个进程中保持一致和稳定。