Я пытаюсь отладить приложение 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
Что я делаю не так?
Спасибо.