Ответ 1
Вы пытались закрыть пул с помощью pool.close
, а затем дождаться завершения процесса pool.join
, потому что если родительский процесс продолжает работать и не ждет дочерних процессов, он станет zombies
У меня возникла странная проблема при использовании библиотеки многопроцессорности 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;
Вы пытались закрыть пул с помощью pool.close
, а затем дождаться завершения процесса pool.join
, потому что если родительский процесс продолжает работать и не ждет дочерних процессов, он станет zombies
Попробуйте установить аргумент maxtasksperchild в пуле. Если вы этого не сделаете, процесс снова и снова будет перезапущен пулом, поэтому память никогда не будет выпущена. Когда установлено, процессу будет разрешено умереть, и в нем будет создан новый. Это эффективно очистит память.
Я предполагаю, что это новое в 2.7: http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool
Вероятно, вы должны вызвать close()
, а затем wait()
на свой Pool
объект.
http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool
join()
Подождите, пока рабочие процессы выйдут. Перед использованием join() нужно вызвать функцию close() или terminate().