python – 生成新进程时导入会发生什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 生成新进程时导入会发生什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1917字,纯文字阅读大概需要3分钟。
内容图文
![python – 生成新进程时导入会发生什么?](/upload/InfoBanner/zyjiaocheng/954/19fc951d851642ec929c680b34e530cd.jpg)
生成新进程时导入的模块变量会发生什么变化?
IE
with concurrent.futures.ProcessPoolExecutor(max_workers=settings.MAX_PROCESSES) as executor:
for stuff in executor.map(foo, paths):
哪里:
def foo(str):
x = someOtherModule.fooBar()
foob??ar访问someOtherModule开头声明的东西:
someOtherModule.py:
myHat='green'
def fooBar():
return myHat
具体来说,我有一个模块(称为Y),它在任何函数之外的顶部初始化了py4j网关.在模块X中,我一次加载多个文件,加载后对数据进行排序的函数使用Y中的函数,该函数又使用网关.
这个设计是pythonic吗?
在每个新进程生成后,我应该导入我的Y模块吗?或者有更好的方法吗?
解决方法:
在Linux上,fork将用于生成子进程,因此父进程的全局范围内的任何内容也将在子进程中可用,并具有写时复制语义.
在Windows上,您在父进程的__main__模块中的模块级别导入的任何内容都将在子进程中重新导入.
这意味着如果你有一个父模块(让我们称之为someModule),就像这样:
import someOtherModule
import concurrent.futures
def foo(str):
x = someOtherModule.fooBar()
if __name__ == "__main__":
with concurrent.futures.ProcessPoolExecutor(max_workers=settings.MAX_PROCESSES) as executor:
for stuff in executor.map(foo, paths):
# stuff
而someOtherModule看起来像这样:
myHat='green'
def fooBar():
return myHat
在此示例中,someModule是脚本的__main__模块.因此,在Linux上,你在子进程中获得的myHat实例将是someModule中的一个copy-on-write版本.在Windows上,每个子进程一加载就会重新导入someModule,这也会导致someOtherModule重新导入.
我不太了解py4j网关对象,以确定您是否确定这是否是您想要的行为.如果Gateway对象是pickleable,您可以显式地将它传递给每个子节点,但是您必须使用multiprocessing.Pool而不是concurrent.futures.ProcessPoolExecutor:
import someOtherModule
import multiprocessing
def foo(str):
x = someOtherModule.fooBar()
def init(hat):
someOtherModule.myHat = hat
if __name__ == "__main__":
hat = someOtherModule.myHat
pool = multiprocessing.Pool(settings.MAX_PROCESSES,
initializer=init, initargs=(hat,))
for stuff in pool.map(foo, paths):
# stuff
但是,您似乎并不需要为用例执行此操作.你很可能使用重新导入.
内容总结
以上是互联网集市为您收集整理的python – 生成新进程时导入会发生什么?全部内容,希望文章能够帮你解决python – 生成新进程时导入会发生什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。