让我们说我有一个处理文本json的python程序。使用multiprocessing.Pool
,我将咀嚼数十万个json文件;这通常需要几天时间。
我有两个脚本。有一个master.py脚本可以生成进程。生成的进程运行外部程序,并通过subprocess.run
将结果传递给另一个python脚本。
otherProgram {args} | pipe.py {more args}
master.py
不会直接产生pipe.py
进程;这是由OS调用完成的,所以我导入master.py' are not shared with the imports required by
pipe.py`。
在48节点机器上,我最多并行运行了44个线程(即multiprocessing.Pool(44, maxtaskperchild = 10)
)。
所以我有两个关于导入过程的相关问题:
有没有办法主要导入标准库,并且一个带有一些辅助函数的自定义模块会以一种我可能会注意到的方式对性能产生负面影响?
如果有,有没有办法优化pipe.py
流程的导入?不是导入os
和binascii
以及tarfile
数十万次,有没有办法让同一组导入可用于多个进程?
答案 0 :(得分:0)
我使用可执行脚本(import_stuff.py
)对此进行了测试,该脚本与相关pipe.py
的导入相同。
import subprocess, multiprocessing, datetime
def proc():
subprocess.run(['/path/to/import_stuff.py', shell = True])
then = datetime.datetime.now()
for _ in range(1000):
p.appy_async(proc)
p.close()
p.join()
delta = datetime.datetime.now() - then
print(delta)
0:00:00.665622
0:00:05.981406
0:01:10.125345
由于我的程序的100,000次迭代需要数小时才能运行,因此重复导入内容的开销并不是很大。