以下脚本生成 100 个大小为 100000 的随机字典,将每个 (key, value) 元组馈送到队列中,同时一个单独的进程从队列中读取:
import multiprocessing as mp
import numpy.random as nr
def get_random_dict(_dummy):
return dict((k, v) for k, v in enumerate(nr.randint(pow(10, 9), pow(10, 10), pow(10, 5))))
def consumer(q):
for (k, v) in iter(q.get, 'STOP'):
pass
q = mp.Queue()
p = mp.Process(target=consumer, args=(q,))
p.start()
for d in mp.Pool(1).imap_unordered(get_random_dict, xrange(100)):
for k, v in d.iteritems():
q.put((k, v))
q.put('STOP')
p.join()
我期望内存使用量保持不变,因为消费者进程在主进程提供数据时从队列中提取数据。我验证了数据不会在队列中累积。
但是,我监控了内存消耗,并且随着脚本的运行它不断增加。如果我替换imap_unordered
为for _ in xrange(100): d = get_random_dict()
,那么内存消耗是恒定的。解释是什么?