我有一个类C
,它必须在父进程上使用GPU,但只能在子进程上使用CPU。
由于C
通过序列化发送到子进程,为了更安全,我决定将__reduce__
添加到C
,以便我可以在序列化之前修改一个标志:< / p>
def __reduce__(self):
"""
This is just to avoid that we use the gpu on subprocesses.
"""
p = self.copy(shallow=True)
p._cpu_only = True
return _dummy_rebuild, (p,)
由于无限递归,这不起作用。我看到两个解决方案:
__reduce__
p
p
的属性并从中重建我认为选项1更可取,因为它并不依赖于类的内部。
唯一的问题是我无法移除__reduce__
。有办法吗?
答案 0 :(得分:2)
( * )无法从__reduce__
删除p
,因为仅__reduce__
方法存在于您的班级而不是每个单独的实例。您可以通过从类中删除它来从所有实例中删除它,但是您不能仅从选择的实例中删除它。
(*从技术上讲,它取决于序列化程序。根据序列化程序如何检查是否存在__reduce__
方法,它可能会也可能不会被欺骗认为p
没有。但这绝对不是一个好主意。)
因此,您唯一/最佳选择是重写__reduce__
方法,以便它不会返回您班级的实例。