And*_*oti 6 python import optimization runtime multiprocessing
PEP 8规定:
导入总是放在文件的顶部,就在任何模块注释和文档字符串之后,以及模块全局变量和常量之前。
但是,如果我正在导入的类/方法/函数仅由子进程使用,那么在需要时进行导入肯定会更有效?我的代码基本上是:
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)
Run Code Online (Sandbox Code Playgroud)
main() 是主要的应用程序。此函数需要大量导入才能运行,并且会占用一些 ram 空间 (+/- 35MB)。由于应用程序在另一个进程中运行,因此在 PEP 8 之后进行了两次导入(一次由父进程执行,另一次由子进程执行)。还应该注意的是,这个函数应该只被调用一次,因为父进程正在等待查看应用程序是否崩溃并留下退出代码(感谢faulthandler)。所以我在 main 函数中对导入进行了编码,如下所示:
def main(dump_file):
import shutil
import locale
import faulthandler
from PySide.QtCore import Qt
from PySide.QtGui import QApplication, QIcon
Run Code Online (Sandbox Code Playgroud)
代替:
import shutil
import locale
import faulthandler
from PySide.QtCore import Qt
from PySide.QtGui import QApplication, QIcon
def main(dump_file):
Run Code Online (Sandbox Code Playgroud)
是否有一种“标准”方式来处理使用多处理完成的导入?
PS:我看过这个姐妹的问题
“标准”方式是 PEP 8 报告的方式。这就是 PEP 8 的用途:Python 编码的参考指南。
但总有例外。本案就是其中之一。
由于 Windows 不会克隆父进程的内存,因此当生成子进程时,子进程必须重新导入所有模块。Linux 以更优化的方式处理进程,避免了此类问题。
我不熟悉 Windows 内存管理,但我想说这些模块是共享的,不会加载两次。您可能看到的是两个进程的虚拟内存,而不是物理内存。在物理内存上,只应加载模块的一份副本。
是否遵循 PEP 8 由您决定。当资源受到限制时,代码需要进行调整。但如果没有必要,不要过度优化代码!这是一个错误的做法。
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |