2016-01-19 275 views
5

以下のコードを実行すると、メモリが増加していました。しかし、私がtime.sleep(3)を削除した場合、0.1topであり、決して増加しませんでした。Python - なぜtime.sleepがメモリリークを引き起こすのですか?

processは正しく終了していないようですが、なぜですか?

コード(Python 2.7.11):

import time 
import multiprocessing 

def process(): 
    #: FIXME 
    time.sleep(3) 
    return 

def main(): 
    pool = multiprocessing.Pool(processes=10) 
    while 1: 
     pool.apply_async(process) 
    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    main() 
+0

@vks公式ドキュメントでは、「join()を使用する前にclose()またはterminate()を呼び出す必要があります」とhttps://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing。 Pool.join – tanglong

+2

次の質問は面白いかもしれません:http://stackoverflow.com/questions/7648967/python-multiprocessing-how-to-release-memory-when-a-process-is-done user1914881: "プールのmaxtasksperchild引数を設定してください。そうしないと、プロセスがプールによって何度も再利用され、メモリーが解放されることはありません。それはメモリを効果的にクリーンアップします。プロセスはあなたのwhileループで決して解放されない少しのメモリを保持しているようです。 (私は確信していませんが) –

+0

@RobinSpiess私は 'maxtasksperchild'を試しましたが、助けてくれませんでした。 – tanglong

答えて

1

は、私の知る限りでは、私はあなたが同じプールに新しいプロセスを生成するように、ガベージコレクションが実行されることはありませんと思いますので、あなたがからメモリを解放しません。たとえあなたがそれらを使って済んでいても、古いプロセスを削除することができます 一つの修正はあなたのwhileループでガベージコレクションを強制するために、次のようになります。

import time 
import multiprocessing 
import gc 

def process(): 
    time.sleep(3) 
    return 

def main(): 
    pool = multiprocessing.Pool(processes=10) 
    while 1: 
     pool.apply_async(process) 
     gc.collect() 
    pool.close() 
    pool.join() 


if __name__ == '__main__': 
    main() 

これは、プロセスの別のセットを起動する前に、ガベージコレクションを強制するように、私のためにメモリリークを修正しました。 誰かがこのメモリリークの理由をより詳細に説明できることを願っています。

+0

ありがとうございました。 – tanglong

関連する問題