Подтвердить что ты не робот

Многопроцессорность Python - Как освободить память при выполнении процесса?

У меня возникла странная проблема при использовании библиотеки многопроцессорности python.

Мой код приведен ниже: я создаю процесс для каждого кортежа "символ, дата". Затем я совмещаю результаты.

Я ожидаю, что когда процесс выполнит вычисления для кортежа "symbol, date", он должен освободить свою память? по-видимому, это не так. Я вижу десятки процессов (хотя я установил пул процессов размером 7), которые были приостановлены¹ в машине. Они не потребляют процессор, и они не освобождают память.

Как я могу позволить процессу освободить свою память после того, как он выполнил свои вычисления?

Спасибо!

¹ "приостановлено" Я имею в виду, что их статус в команде ps показан как "S +"

def do_one_symbol( symbol, all_date_strings ):
    pool = Pool(processes=7)
    results = [];
    for date in all_date_strings:
        res = pool.apply_async(work, [symbol, date])
        results.append(res);

    gg = mm = ss = 0;
    for res in results:
        g, m, s = res.get()
        gg += g; 
        mm += m; 
        ss += s;
4b9b3361

Ответ 1

Вы пытались закрыть пул с помощью pool.close, а затем дождаться завершения процесса pool.join, потому что если родительский процесс продолжает работать и не ждет дочерних процессов, он станет zombies

Ответ 2

Попробуйте установить аргумент maxtasksperchild в пуле. Если вы этого не сделаете, процесс снова и снова будет перезапущен пулом, поэтому память никогда не будет выпущена. Когда установлено, процессу будет разрешено умереть, и в нем будет создан новый. Это эффективно очистит память.

Я предполагаю, что это новое в 2.7: http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool

Ответ 3

Вероятно, вы должны вызвать close(), а затем wait() на свой Pool объект.

http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool

join()Подождите, пока рабочие процессы выйдут. Перед использованием join() нужно вызвать функцию close() или terminate().