将实例方法传递到python多处理进程
如果我将对实例方法的引用而不是模块级方法的引用传递到将实例方法传递到python多处理进程,python,python-multiprocessing,Python,Python Multiprocessing,如果我将对实例方法的引用而不是模块级方法的引用传递到多处理.Process,当我调用它时,它的start方法是传入的父进程实例的精确副本,还是再次调用构造函数?“deep”实例成员对象会发生什么情况?确切副本或默认值?实例不会在进程之间传递,因为实例是每个Python VM进程的 进程之间传递的值是pickled。取消勾选通常通过调用\uuuuu init\uuuu以外的方法恢复实例;据我所知,它直接设置属性值以恢复实例,并解析对其他实例的引用 如果您在两个进程中运行相同的代码(并且使用多处理)
多处理.Process
,当我调用它时,它的start方法是传入的父进程实例的精确副本,还是再次调用构造函数?“deep”实例成员对象会发生什么情况?确切副本或默认值?实例不会在进程之间传递,因为实例是每个Python VM进程的
进程之间传递的值是pickle
d。取消勾选通常通过调用\uuuuu init\uuuu
以外的方法恢复实例;据我所知,它直接设置属性值以恢复实例,并解析对其他实例的引用
如果您在两个进程中运行相同的代码(并且使用多处理
),则会在已恢复的实例链中恢复对正确实例方法的引用
这意味着,如果对象链中的\uuuu init\uuuu
做了一些副作用的事情,那么它将不会在接收端(即在子流程中)完成。显式地执行此类初始化
总而言之,在并行进程之间共享(有效地)不可变对象,并在
join()
ing所有对象之后协调结果是最容易的。解析对其他实例的引用是什么意思?假设其中一个实例属性是db连接对象。如何重新创建这样一个有状态属性?想象一下序列化和反序列化('a','b')
。一旦恢复了'a'
和'b'
,就会重新创建一个元组
实例,并将其作为第一和第二个元素指向新创建的Sting。这同样适用于几乎所有的实例属性:在没有移动部件的情况下,很少序列化单个对象,并且所有移动部件都是对其他对象的引用。它显然不能序列化db连接对象。序列化它不是一个好主意,但仍然有。