微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python多处理linux的Windows差异

这段代码在linux上执行,但是抛出了一个AttributeError:type对象'T'在窗口上没有属性'val',为什么?

from multiprocessing import Process import sys class T(): @classmethod def init(cls,val): cls.val = val def f(): print(T.val) if __name__ == '__main__': T.init(5) f() p = Process(target=f,args=()) p.start()

父进程和subprocess,如果退出,如何通知其他退出

python – 从bash调用脚本时终止subprocess

python中map.pool的用法是什么?

实现与gevent兼容的工作进程池的最佳方式是什么?

只能在一个处理器上运行的进程可以在其他处理器上运行吗?

Windows缺少一个fork()系统调用,它重复了当前进程。 这有很多含义,包括windows多处理文档页面上列出的那些。 进一步来说:

请记住,如果在子进程中运行的代码尝试访问全局变量,那么它所看到的值(如果有)可能与Process.start被调用时父进程中的值不同。

在内部,Python通过从头开始一个新的进程,并告诉它再次加载所有模块,在Windows上创建一个新的进程。 所以你在目前的过程中所做的任何改变都不会被看到。

在你的例子中,这意味着在子进程中,你的模块将被加载,但if __name__ == '__main__'部分将不会运行。 所以T.val不会被调用,并且T.val不会存在,所以你看到的错误

另一方面,在POSIX系统(包括Linux)上,进程创建使用fork,所有全局状态保持不变。 孩子运行一切的副本,所以它不必重新加载任何东西,并会看到它的副本的T与val副本。

这也意味着POSIX系统上的资源创建过程要快得多,而且要轻得多,特别是当“复制”使用写时复制来避免实际复制数据的开销。

使用多处理时还有其他的怪癖,所有这些都在python多处理指南中详细说明。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐