在Python中使用多处理时,导入语句的正确方法是什么?

在Python中使用多处理时,导入语句的正确方法是什么?,python,optimization,import,runtime,multiprocessing,Python,Optimization,Import,Runtime,Multiprocessing,国家: 导入总是放在文件的顶部,就在任何模块注释和docstring之后,模块全局变量和常量之前 但是,如果我正在导入的类/方法/函数仅由子进程使用,那么在需要时进行导入肯定更有效?我的代码基本上是: p = multiprocessing.Process(target=main,args=(dump_file,)) p.start() p.join() print u"Process ended with exitcode: {}".format(p.exitcode) if os.path.

国家:

导入总是放在文件的顶部,就在任何模块注释和docstring之后,模块全局变量和常量之前

但是,如果我正在导入的类/方法/函数仅由子进程使用,那么在需要时进行导入肯定更有效?我的代码基本上是:

p = multiprocessing.Process(target=main,args=(dump_file,))
p.start()
p.join()
print u"Process ended with exitcode: {}".format(p.exitcode)
if os.path.getsize(dump_file) > 0:
    blc = BugLogClient(listener='http://21.18.25.06:8888/bugLog/listeners/bugLogListenerREST.cfm',appName='main')
    blc.notifyCrash(dump_file)
main()是主应用程序。此函数需要大量导入才能运行,这些导入会占用一些ram空间(+/-35MB)。当应用程序在另一个进程中运行时,导入在PEP 8之后执行了两次(一次由父进程执行,另一次由子进程执行)。还应注意,此函数只应调用一次,因为父进程正在等待应用程序是否崩溃并留下exitcode(多亏了faulthandler)。因此,我在主函数中对导入进行了如下编码:

def main(dump_file):

    import shutil
    import locale

    import faulthandler

    from PySide.QtCore import Qt
    from PySide.QtGui import QApplication, QIcon
而不是:

import shutil
import locale

import faulthandler

from PySide.QtCore import Qt
from PySide.QtGui import QApplication, QIcon

def main(dump_file):
是否有“标准”方法来处理使用多处理完成的导入


附言:我已经看到了这一点,

标准的方式是政治公众人物第8版报道的方式。这就是PEP8的作用:Python编码参考指南

但总有例外。这个案子就是其中之一

由于Windows不克隆父进程内存,因此在生成子进程时,子进程必须重新导入所有模块。Linux以一种更优化的方式处理进程,避免了类似这样的问题

我不熟悉Windows内存管理,但我认为模块是共享的,不会加载两次。您可能看到的是这两个进程的虚拟内存,而不是物理内存。在物理内存上,只应加载模块的一个副本


是否遵循政治公众人物第8条取决于您。当资源是约束时,代码需要调整。但如果没有必要,不要过度优化代码!这是一个错误的方法

将导入放在顶部,按照PEP 8操作。您如何知道使用建议的方法节省了多少内存?我可以使用windows任务管理器查看每个进程需要多少内存。按照我提出的方法,父进程占用6Mb,按照PEP8占用36Mb。这让人尴尬。是的,你又对了,我的“解决方案”根本帮不上忙。也许现在已经太晚了,如果我有了一个可行的想法,我会回来:)在unixy系统上,
多处理
是一种便宜的
分叉
,孩子们可以在写时拷贝父空间的视图。不会重新导入任何内容,“在顶部导入”规则是有意义的。在Windows中,
多处理
需要对环境进行pickle处理,并在子进程空间中重建它。减少进口在那里很有意义,即使它还没有完全实现。不管怎么说,这是一种黑客行为。。。因此,请继续您的代码中的传统!