我正在尝试调试在multiprocessing.Pool
中使用8个并行进程的Python(3.7)应用程序,以从API中提取一些大图像,对其进行转码,然后将结果推送到S3。
我的程序在处理图像时正在使用越来越多的内存,每个工作程序的使用开始为3-500Mb,最后达到几个Gb,最终导致应用程序崩溃。
为了限制内存使用量,我指定了maxtasksperchild
来查看某些进程是否正在使用泄漏的C库,以及是否可以在几次迭代后对其进行硬清理。这是相关的代码块:
from multiprocessing import Pool, Value
def batch_process(ie, create_image=True, overwrite=False):
def _init(_i, _ct, _overwrite):
global i, ct, overwrite
i = _i
ct = _ct
overwrite = _overwrite
if create_image:
with Pool(initializer=_init, initargs=(
Value("I", 1), ie.pref_rep.file_ct, overwrite
), maxtasksperchild=4) as pool:
pool.map(_process_image, ie.default_range)
pool.close()
pool.join()
else:
logger.info("Skipping image creation.")
最初开始8个过程。经过几次迭代后,我看到top
中的进程乘以初始数量的3-4倍,然后几秒钟(图像I / O和处理各花费一分钟左右)它们返回到8,但其余进程的PID与开始进程的PID相同。从下面top
转储中的运行时间值可以清楚地看出。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
705 scossu 20 0 2449428 1.797g 21080 S 2.0 5.9 7:49.02 python3
708 scossu 20 0 2721672 2.042g 21080 S 2.0 6.7 8:05.62 python3
709 scossu 20 0 2666756 1.990g 21080 S 2.0 6.5 7:59.60 python3
704 scossu 20 0 2639776 1.969g 21080 S 1.7 6.4 7:55.63 python3
707 scossu 20 0 2586988 1.919g 21080 S 1.7 6.3 7:59.98 python3
710 scossu 20 0 2647196 1.981g 21080 S 1.7 6.5 8:03.69 python3
711 scossu 20 0 2803896 2.115g 21080 S 1.3 6.9 8:11.78 python3
700 scossu 20 0 1043892 548448 19100 S 0.3 1.7 2:27.15 python3
我在做什么错了?
谢谢。