大佬教程收集整理的这篇文章主要介绍了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
到上面的代码中。)
以上是大佬教程为你收集整理的multiprocessing.Process(使用spawn方法):继承了哪些对象?全部内容,希望文章能够帮你解决multiprocessing.Process(使用spawn方法):继承了哪些对象?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。