在pool.imap_unordered上迭代

use*_*515 5 python iterator multiprocessing

考虑非常简单的代码:

#!/usr/bin/python

from multiprocessing import Pool
import random

def f(x):
    return x*x

def sampleiter(n):
    num = 0
    while num < n:
     rand = random.random()
     yield rand
     num += 1

if __name__ == '__main__':
    pool = Pool(processes=4)              # start 4 worker processes
    for item in pool.imap_unordered(f, sampleiter(100000000000000), 20):
     print item
    pool.close
Run Code Online (Sandbox Code Playgroud)

在终端中运行时,Python泄漏了内存.
可能有什么不对?

jdi*_*jdi 2

我在这里看到的唯一导致内存泄漏的变量是您的 print 语句。当我替换print item为时pass,内存保持较低且恒定。我不确定打印时到底发生了什么,但显然它会堆积一些东西而不是释放。另外,当我将块大小降低到 1 时,内存增加得更慢(显然),但也需要更长的时间。所以它确实会增加内存使用量。

更新

发现这是由于终端的历史缓冲区(而不是 python 进程本身)而导致内存使用量增加的具体参考:Memory Leak when running python in Mac OS Terminal