Python子进程池:即使使用`maxtasksperchild`

时间:2019-05-15 17:20:35

标签: python-3.x memory-management multiprocess

我正在尝试调试在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  

我在做什么错了?

谢谢。

0 个答案:

没有答案