程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了multiprocessing.Process(使用spawn方法):继承了哪些对象?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决multiprocessing.Process(使用spawn方法):继承了哪些对象??

开发过程中遇到multiprocessing.Process(使用spawn方法):继承了哪些对象?的问题如何解决?下面主要结合日常开发的经验,给出你关于multiprocessing.Process(使用spawn方法):继承了哪些对象?的解决方法建议,希望对你解决multiprocessing.Process(使用spawn方法):继承了哪些对象?有所启发或帮助;

这与将类发送到派生的Process时对其进行腌制的方式有关。类的腌制版本实际上并不包含其内部状态,而仅包含模块和类的名称:

class A:
   y = 0

pickle.dumps(A)
# b'\x80\x03c__main__\nA\nq\x00.'

这里没有任何信息y,可以与对该类的引用进行比较。

当以argumeht的形式传递给时g,该类将在生成的进程中被取消选择,该类将在必要时导入其模块(在__main__并返回对该类的引用,因此在@H_891_5@main函数中对其进行的更改不会影响该类,因为会if __name__ == "__main__"赢得该块不会在子流程中执行。f直接在其模块中使用该类,因此效果基本相同。

x显示不同值的原因略有不同。您的f函数将从模块中打印 全局 变量x。在您的@H_891_5@main()函数中,您还有另一个 局部 变量x,因此在两个进程中,x = 1此处的设置都不会影响模块级别x。它g作为参数传递给它,因此在这种情况下,它将保留本地值为1。

解决方法

docs(python 3.4)通过进行了解释spawn,“子进程将仅继承运行进程对象的run()方法所需的那些资源”。

但是哪些对象是“必需的”?我阅读它的方式告诉我,从内部可以到达的所有对象run()都是“必需的”,包括传递args给的参数Process.__init__,以及存储在全局变量中的所有内容,以及在全局范围内定义的类,函数及其属性。但是,这是不正确的。以下代码确认未继承全局变量中存储的对象:

# running under python 3.4 / Windows
# but behaves the same under Unix
import multiprocessing as mp

x = 0
class A:
    y = 0

def f():
    print(X) # 0
    print(A.y) # 0

def g(x,A):
    print(X) # 1
    print(A.y) # 0; really,not even args are inherited?

def main():
    global x
    x = 1
    A.y = 1
    p = mp.process(target = f)
    p.start()
    q = mp.process(target = g,args = (x,A))
    q.start()


if __name__=="__main__":
    mp.set_start_method('spawn')
    main()

是否有明确的规则规定要继承哪些对象?

编辑:

确认:在Ubuntu上运行会产生相同的输出。(感谢@mata阐明我忘了添加global x到@H_891_5@main()。)这一遗漏使我的示例感到困惑;如果我切换'spawn''fork'Ubuntu下,也会影响结果。我现在添加global x到上面的代码中。)

@H_675_84@@H_675_84@
@H_675_84@

大佬总结

以上是大佬教程为你收集整理的multiprocessing.Process(使用spawn方法):继承了哪些对象?全部内容,希望文章能够帮你解决multiprocessing.Process(使用spawn方法):继承了哪些对象?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。