Пул подпроцесса Python: процессы работают даже с `maxtasksperchild` - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь отладить приложение Python (3.7), которое использует 8 параллельных процессов в multiprocessing.Pool, чтобы извлечь некоторые большие изображения из API, перекодировать их и отправить результаты на S3.

Моя программа использует все больше памяти при обработке изображений, при этом каждый рабочий загружается с использованием 3-500 Мбайт и занимает несколько гигабайт, что приводит к сбою приложения.

В попытке ограничить использование памяти я указал 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 раза на исходное число, затем через пару секунд (ввод / вывод изображения занимает около минуты), они возвращаются к 8, но 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  

Что я делаю не так?

Спасибо.

...