python - python会使用multiprocessing.sharedctypes收集共享内存中分配的内存吗?

标签 python garbage-collection multiprocessing

我使用 multiprocessing.sharedctypes.Array() 分配共享内存来进行多处理。但是,当程序运行时,我观察到 kernel_task 占用了大量内存(如 9GB)并且交换内存正在增加。所以我想知道 python 会自动收集共享内存中分配的内存吗?

另外,我检查了 multiprocessing.heap 的代码,它确实有 malloc() 和 free()。但是在 sharedctype s.py 中,它只调用了 malloc()。

最佳答案

最后,我找到了解决方案。我使用 multiprocess.Pool.map 在这样的函数中进行多处理:

def gemm():
    pool = multiprocess.Pool(processes=4)
    pool.map(some_fun,arg_list)

for i in xrange(10):
    gemm()

但是,我忘记在 pool.map 之后添加 pool.close() 和 pool.join()。所以每次调用gemm都会消耗一些内存。即使引用计数为零,池也不会释放其资源。 正确的做法是添加 pool.close() 和 pool.join():

def gemm():
    pool = multiprocess.Pool(processes=4)
    pool.map(some_fun,arg_list)
    pool.close()
    pool.join()

for i in xrange(10):
    gemm()

我仍然不确定池不释放其资源的确切原因是什么,但这是解决方案。

关于python - python会使用multiprocessing.sharedctypes收集共享内存中分配的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26873606/

相关文章:

java - 垃圾收集和 JNI 调用

assembly - 8086多处理有什么标准吗?

python - 上下文管理器和多处理池

python - Tornado Web 服务器和多线程共享问题

python csv.dictreader 不使用 data.gov csv

python - 如何正确抓取基于 JavaScript 的网站?

java - XML Pull Parser 和 SAX Parser 有什么区别

python - 在 setup.py 中生成和复制一些文件到任意位置的推荐方法是什么?

python - 给定一个数字列表,找到所有矩阵,使得每列和每行的总和为 264

java - 如果在 "sleep"期间发生完整 GC,Thread.sleep 将如何表现?