我目前正在使用python多处理编写一个CPU绑定脚本。主模块有很多import语句,这些语句在启动新进程时会产生开销。这些导入对于运行程序的并行部分来说是不必要的,所以我不想导入它们。这可以通过将我所有的import语句放在if __name__ == "__main__":
中来解决,但是这是一个很大的代码库,一个并行处理模块可以被许多不同经验水平的开发人员使用。(我不想修复一切,也不想让其他人破坏它)。
我想只导入必要的模块来运行代码的并行处理部分。我已经找到了一个解决方法,但它让我觉得......很笨拙。我更新sys.modules并说__main__
是并行处理的模块,然后在完成后放回main。例如:
try:
main = sys.modules["__main__"]
sys.modules.update({"__main__": sys.modules[__name__]})
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
finally:
sys.modules.update({"__main__": main})
字符串
这段代码运行时只导入所需的模块。但我担心在表面下隐藏着一些可怕的后果。
理想情况下,我希望有一个多处理的替代方案,让我更好地控制在进程生成时克隆的内容。有没有人有一个建议,一个不那么可怕的解决方案,或者让我放心,我的工作并不像我担心的那样可怕?
我使用的是Windows和Python 3.5。
谢谢你,谢谢
1条答案
按热度按时间6ljaweal1#
我的猜测是
joblib
会做得更好,请参阅this very complete discussion了解更多信息。