Estou usando 'multiprocess.Pool.imap_unordered' conforme a seguir
from multiprocessing import Pool
pool = Pool()
for mapped_result in pool.imap_unordered(mapping_func, args_iter):
do some additional processing on mapped_result
Eu preciso ligar pool.close
ou pool.join
após o loop for?
pool.join()
entãopool.close()
depois de iniciar todos os threads do pool, mas não tentei usarpool.imap_unordered()
como iterável.Respostas:
Não, não precisa, mas provavelmente é uma boa ideia se você não vai mais usar a piscina.
Razões para ligar
pool.close
oupool.join
são bem ditas por Tim Peters neste post do SO :fonte
pool.close()
primeiro epool.join()
segundo. Isso permite que você adicione trabalho entre opool.close()
e opool.join()
que não precisa aguardar o término da execução do pool.pool.close()
primeiro, é realmente obrigatório. Dos documentos : Deve-se ligarclose()
outerminate()
antes de usarjoin()
.Eu tive o mesmo problema de memória, pois o uso de memória continua crescendo com o multiprocessing.pool do Python quando eu não usei
pool.close()
epool.join()
ao usarpool.map()
com uma função que calculava a distância de Levenshtein. A função funcionava bem, mas não era coletada como lixo corretamente em uma máquina Win7 64, e o uso de memória continuava crescendo fora de controle toda vez que a função era chamada, até derrubar todo o sistema operacional. Aqui está o código que corrigiu o vazamento:Após fechar e ingressar no pool, o vazamento de memória foi embora.
fonte
ERROR: Terminated with signal 15
antes de adicionar o código de limpeza,pool.close();pool.join();
mas depois de adicionar esse código de limpeza, não recebo as mensagens do console. então eu suspeito pelo menos na minha versão, python 2.7 de C7, que o pool talvez de alguma forma não estava limpando exatamente.