Прежде всего концепция карты, имеющей все подпроцессы в памяти, неверна, карта имеет весь повторяемый (входной) в памяти, превратив его в список. Однако он содержит только количество рабочих (пул), которые вы создаете, см. Пример.
Если проблема в том, что итерация длинная и занимает много памяти сама по себе, то лучше использовать imap, поскольку она не сохраняет всю итерацию в памяти, а просто берет следующую и передает ее работнику , Дополнительным преимуществом является то, что imap возвращает результаты напрямую (но по порядку), чтобы его можно было использовать основным процессом.
После того, как один рабочий завершит свою задачу, память освобождается, что можно проверить с помощью примера кода из-за временных задержек.
Пример:
import multiprocessing
import random
import time
def func(x):
"""
1. Prints the process and input
2. Waits a bit
3. Uses a lot of memory
4. Waits a random amount more
"""
print(f'{multiprocessing.current_process()}: {x}')
time.sleep(5)
a = list(range(10000000))
time.sleep(5 + random.randint(0, 5))
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
pool.map(func, range(10))
Выход:
<ForkProcess(ForkPoolWorker-1, started daemon)>: 0
<ForkProcess(ForkPoolWorker-2, started daemon)>: 1
<ForkProcess(ForkPoolWorker-3, started daemon)>: 2
<ForkProcess(ForkPoolWorker-4, started daemon)>: 3
<ForkProcess(ForkPoolWorker-2, started daemon)>: 4
<ForkProcess(ForkPoolWorker-4, started daemon)>: 5
<ForkProcess(ForkPoolWorker-3, started daemon)>: 6
<ForkProcess(ForkPoolWorker-1, started daemon)>: 7
<ForkProcess(ForkPoolWorker-4, started daemon)>: 8
<ForkProcess(ForkPoolWorker-3, started daemon)>: 9