Using multiprocessing in Python, what is the correct approach for import statements?
PEP 8状态:
Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.
但是,如果我要导入的类/方法/函数仅由子进程使用,那么在需要时执行导入确实更有效?我的代码基本上是:
1 2 3 4 5 6 7 | 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)。当应用程序在另一个进程中运行时,导入在PEP8之后执行了两次(一次由父进程执行,另一次由子进程执行)。还应该注意的是,该函数只应调用一次,因为父进程正在等待查看应用程序是否崩溃并留下一个exitcode(由于faultHandler)。所以我在主函数中对导入进行了如下编码:
1 2 3 4 5 6 7 8 9 | def main(dump_file): import shutil import locale import faulthandler from PySide.QtCore import Qt from PySide.QtGui import QApplication, QIcon |
而不是:
1 2 3 4 5 6 7 8 9 | import shutil import locale import faulthandler from PySide.QtCore import Qt from PySide.QtGui import QApplication, QIcon def main(dump_file): |
是否有"标准"方法来处理使用多处理完成的导入?
附言:我见过这个姐妹问题。
"标准"方法是PEP 8报告的方法。这就是PEP8的作用:在Python中编码的参考指南。
但总有例外。这个案子就是其中之一。
由于Windows不克隆父进程内存,因此在生成子进程时,子进程必须重新导入所有模块。Linux以更优化的方式处理进程,避免类似的问题。
我不熟悉Windows内存管理,但我想说,这些模块是共享的,不会加载两次。您可能看到的是两个进程的虚拟内存,而不是物理内存。在物理内存上,只应加载模块的一个副本。
是否遵循PEP 8取决于你。当资源是约束时,代码需要适应。但如果没有必要,不要过度优化代码!那是错误的做法。